전체 글 34

2019년 회고

개발얘기 별로 없는 개발자의 2019년 회고 ㅎㅎ 프로젝트 영세소상공인 프로젝트 2018년 11월부터 영세 소상공인 프로젝트를 시작했다. 배달의민족 업주분들의 카드 수수료 부담을 덜 수 있도록 하는게 목적이었다. 여러 PG사와 결제 데이터를 주고 받는데 해결해야 할 문제가 많았다. (특히 기획자 분이 고생하셨다.) 연동 날짜가 급하게 잡혀 설날도 셀프 반납하고 밤새며 코딩했다. 중간중간 뇌가 그로기 상태에 빠지기도 하며 머리의 한계를 느낄 수 있었다. 2019년 3월쯤 큰 문제없이 마무리했다. 그 동안 진행했던 프로젝트와 다른 점은 최종적으로 고객(업주)에게 돌아가는 혜택을 개발자로서 조금 더 피부로 느낄 수 있었다는 것이다. 기술만 탐 하는개발자. 개발만 잘 하는 개발자가 되지 말자는 생각을 더더욱 하..

개발/인생후진기어 2020.01.19 (4)

Mac Catalina에서 기본 bash shell이 zsh로 변경 되었습니다.

맥OS를 새롭게 설치하고 기본 세팅을 하던 중 bash-git-prompt, PS1(컬러)등이 제대로 적용되지 않는 문제를 발견했다. 3시간 넘게 삽질한 결과 Catalina부터 default shell이 bash에서 zsh로 바뀐걸 알 수 있었다. Apple 입장에서는 bash 최신버젼 라이센스에 문제가 있어 향후 업데이트에 차질이 생기기 때문에 미연에 방지한것 같다. 아래 명령어를 통해 기본 shell을 bash로 변경하면 경고가 발생한다. $ chsh -s /bin/bash 아래 옵션을 ~/.bash_profile에 추가하여 무시할 수 있다. export BASH_SILENCE_DEPRECATION_WARNING=1 zsh(+잡다한 기능)을 몇 달간 사용해봤지만 익숙해지는데 실패했다. zsh로 다시..

안녕, 우아한형제들

다 떨어졌다. 회사는 점점 기울고 있었다. 처리해야 하는 업무는 개발자고 뭐를 떠나서 한 명의 직원으로서 따져봐도 원하는 일과는 괴리감이 컸다. 기술 스택은 php, python, PostgreSQL이었다. 이직할만한 회사가 많지 않았다. 로켓펀치라는 스타트업 채용 사이트를 중점적으로 검색했지만 java 개발자를 많이 뽑고 있었다. python을 사용할만한 회사는 모두 써봤다. 서버뿐만 아니라 안드로이드 개발도 잘할 자신 있었다. 일단 면접까지 기회만 주면 잘할 수 있을 텐데 코딩 테스트조차 쉽지 않았다. 알고리즘 코딩 테스트 부셔버리고 싶었다. 이곳저곳 포함하면 떨어진 곳은 모두 열 곳이 넘었다. 몇 년 동안 근무하며 피드백을 단 한 번도 받아본 적이 없었다. 지나가는 말로도 들어본적이 없다. 이 좁은..

개발/인생후진기어 2019.12.15 (10)

웹 서비스 출시 전 확인사항

개발자로 일하며 수 차례 서비스를 출시했지만 서비스 오픈은 언제나 설렌다. 정상적으로 작동할까? 장애가 발생하지 않을까? 걱정된다. 내가 그동안 봐온 서비스 장애는 오픈 전 체크 리스트 or 성능 테스트를 통해 해결할 수 있던 것들이었다. 생각나는대로 정리해봤다. 로그 설정 로그 레벨 에러를 INFO레벨로 사용하지는 않았는가 확인한다. 그 반대 경우도 마찬가지다. 불필요한 DEBUG정보가 운영 환경에서 남도록 하지 않았는가 확인한다. 에러 로그 False 알람이 발생하지 않도록한다. 개발자가 정말 알아야 하는 (새벽에 slack으로 에러 알림을 받고 기상해서 바로 패치 후 hotfix로 내보내야 하는) 에러인 경우만 ERROR레벨을 사용한다. 로테이션 로그가 적절히 로테이션+삭제 되는지 확인한다. 이 설..

개발 2019.12.04 (3)

webpack에서 splitChunks 무시하기 (Vue.js)

문제 npm run build를 실행하면 js, css 한 개씩 번들링이 되는게 아니라 chunk되어 생성된다. 이렇게 되면 index.html head에 들어가는 파일명이 매번 바뀌게 된다. 그러면 배포시 계획에 차질이 생기므로 반드시 해결해야 하는 문제였다. 그리고 내가 이쪽 지식이 없는게 문제였다. 현재 버젼 webpack: 4.41.2 vue-cli: 4.0.5 삽질 vue.config.js에 뭔 짓을 하면 될것 같은데? 라는 생각으로 찾아보기 시작했다. module.exports = { chainWebpack: (config) => { config.optimization.delete('splitChunks') }, webpack에 optimization 설정을 무시하려는건데 아무튼..

개발/Frontend 2019.11.27

우아한 Redis - 강대명

우아한 Redis - 강대명 11월 21일 우아한형제들(잠실)에서 강대명님의 Redis 세미나가 있었습니다. 주요 포인트 Redis는 자료구조가 Atomic 하기 때문에 Race Condition을 피할 수 있다. SortedSet의 Score는 실수형이기 때문에 부동 소수점에 유의하자. 하나의 컬렉션에 너무 많은 아이템을 담으면 좋지 않다. 수천개가 적당함. Expire는 Collection에 걸림 메모리 관리를 잘하자. Swap이 발생하면 메모리 Page 접근시마다 느려짐 큰 메모리를 사용하는 instance 하나보다 적은 메모리를 사용하는 여러 instance 여러개가 안전함 데이터의 사이즈가 다양한 것 보다는 유사한게 유리하다. 메모리를 줄이기 위해서 Ziplist를 이용하자. O(N) 명령어를 ..

개발/Linux,Server 2019.11.21

우아한 테크세미나 - 스프링 배치

배치 사람과 상호작용이 없는 애플리케이션 시간이 얼마나 걸리든 해당 시스템에서 완결이 난다. Web vs Batch Web: 실시간 처리 / 상대적인 속도 / QA 용이성 Batch: 후속 처리 / 절대적인 속도 / QA 복잡성 배치는 QA분들이 테스트하기 힘들기 때문에 반드시 테스트 코드를 작성 해야한다. Spring Batch와 Quartz Quartz: 스케쥴링 프레임워크. ex: 매 시간 / 마지막 주 금요일에 실행 Quartz는 Spring Batch의 보안제 역할이지 대체제가 아니다. 배치 애플리케이션이 필요한 상황 일정 주기로 실행되어야 할 때 실시간 처리가 어려운 대량의 데이터를 처리 할 때 대용량 데이터 처리가 절대적인 요구 사항 스프링 배치 모든 데이터를 메모리에 쌓지 않는 방식이 기본..

개발/Java,Spring 2019.09.27 (3)

SpringSecurity에서 anonymous()

Spring에서 테스트를 돌리는 중 Unauthorized(401)가 아닌 Forbidden(403)이 발생하는 문제가 생겼다. @RestController @RequiredArgsConstructor public class PostController { private final PostService postService; @PreAuthorize("isAuthenticated()") @PostMapping("/api/bbs/{name}/posts") public void post(@PathVariable String name, @Valid @RequestBody WritePost request, @AuthenticationPrincipal ExternalUser externalUser) { postSe..

개발/Java,Spring 2019.08.15 (2)

Spring Boot 2.x Security에서 hasPermission 사용

Spring Boot2.x에서 Spring Security를 이용해 권한을 관리 할 수 있다. 기본적으로 Override된 configure(HttpSecurity http)에서 AntMatcher를 이용해 Role확인을 할 수 있다. 하지만 관리 대상과 요구사항이 많아지면 Role만으로는 문제 해결이 용이하지 않다. 그래서 MethodSecurity를 이용한 권한 관리 방법을 간략히 정리한다. Gradle 설정 compile("org.springframework.boot:spring-boot-starter-security") compile("org.springframework.security:spring-security-oauth2-client") compile("org.springframework.s..

개발/Java,Spring 2019.08.11