본문 바로가기

전체 글55

컴파일과 빌드의 차이 IDE에 익숙해진 초보 프로그래머들에게는 컴파일과 빌드의 차이는 애매모호하다. 잡지를 만드는 과정을 예로 들어 이해해보자. 어느날 PanGyo는 마음에 드는 잡지를 발견했다. 다만 아쉬운 점은 그 잡지가 영어로된 잡지여서 친구들과 같이 읽을 수 없다는 점이었다. 그래서 PanGyo는 영어로된 잡지를 한글로 번역해 출판하기로 마음먹었다. 출판하는 과정을 하나씩 살펴보자. 잡지는 영어로된 여러 기사들로 이루어져 있고, 각 기사에는 잡지내 다른 기사를 참조하는 경우가 잦다. 첫번째로 할 일은 각 기사를 한글로 번역하는 일이다. 기사를 영어에서 한글로 번역하면 친구들과 같이 읽을 수 있다. 두번째로 할 일은 원래 기사와 번역된 기사를 연결짓는 일이다. 예를 들어 "영문기사 A"가 번역되어 "한글기사 가"가 된 .. 2021. 7. 23.
로깅을 어떻게 해야할까? AOP를 공부하다보면 대표적인 Cross cutting concern의 예시로 로깅이 언급된다. 컨트롤러 어노테이션을 달고 다니는 오브젝트의 메서드들을 프록시로 감싸서 실행시간을 측정하는 것이 대표적인 로깅의 예시인데, 별로 마음에 들지 않는다. 아래 예시를 보자. 예제 수준의 로깅 코드다. 로깅 메세지를 보면 "-----(대충몇개)----> Respons : {} ~" 식으로 되어 있다. 그러면 거대한 시스템의 경우 초당 수십만개의 로그가 쌓이는데, 저렇게 로깅을 해도 될까? 유튜브 채널 EO에 우아한형제들 전 CTO, 현 CEO인 분이 나와서 얘기하시기를, 평시 리퀘스트는 초당 만개, 이벤트 시에는 200만개가 넘게 들어온다고 한다. 그러면 저런 문자열이 리퀘스트 *2 개만큼 생기고, 컨트롤러 로깅뿐.. 2021. 7. 15.
orElseGet()과 orElse()의 차이 cfdf.tistory.com/34 java, optional의 orElse와 orElseGet의 차이 java8의 optional api 많이들 사용하실텐데요. 어찌보면 당연하지만 햇갈리는 내용에 대해 다뤄보겠습니다. 마무리 연산인 orElse와 orElseGet의 차이입니다. 귀찮으신분들을 위해 요약을 먼저 하자면 orE cfdf.tistory.com orElse와 orElseGet에 대해 흥미로운 글을 봤다. 무심코 넘겼던 부분인데 둘은 꽤 중요한 차이가 있다. orElse(Value)는 Value가 메모리 상에 존재한다고 가정하므로, Value가 함수의 리턴값이라면 Optional 내부 값이 null이건 말건 함수를 실행시켜 Value을 가져온다. 다음의 예제를 보자. orElse문 안의 Valu.. 2021. 3. 27.
Blocking과 Synchronous Synchronous의 뜻은 "동기적인" 이다. 동기적이라는 말의 뜻은 다음과 같다. 두 작업 A, B를 생각해보자. A는 B의 실행이 다 끝나야 그 실행의 결과를 가지고 하던 일을 계속 할 수 있다. 이 경우 A와 B는 동기적이라고 한다. Blocking은 기다리는 동안 다른 일을 못하고 중지된다는 뜻이다. 이 경우 기존에 하던 일을 못하고 다른 일을 하다가 초록색 화살표에서 실행한 작업이 끝나야 기존의 작업을 다시 실행할 수 있다. 헷갈리니 예시를 보자. 출처 :musma.github.io/2019/04/17/blocking-and-synchronous.html 동기와 비동기, 그리고 블럭과 넌블럭 무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 .. 2021. 3. 22.
Field Injection 대신 Constructor Injection을 사용해야 하는 이유 이 글을 작성하기 위해 주입받은 포스트는 다음과 같다. yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/ 이번 공부용 프로젝트를 만들면서 test code를 제외한 모든 코드에 @Autowired를 사용하지 않았다. github.com/kh0712/dailysup 필드 주입 대신 생생자 주입을 사용하는 이유는 순환 의존을 방지해서 안전하다 등 어렴풋이만 알고 있었는데 확실하게 정리해보자. 필드 주입을 사용하면 생기는 문제는 다음과 같다. 첫 번째로 의존 관계를 final로 설정할 수 없다. 런타임에 객체의 의존성이 바뀌는 경우는 흔치 않다. 필드를 final로 선언한다면 런타임시 의존성이 바뀌어 원하지 않는 결과가 나오는 일을 방지할 수 있.. 2021. 3. 21.
Join 쿼리를 어떻게 최적화할까 다음과 같이 사용자 엔티티로 엮여있는 아이템과 디바이스 엔티티를 생각해보자. 특정 조건을 만족한 아이템들의 리스트를 가져와서 그 아이템의 사용자의 디바이스로 알림을 보내고 싶다. 사용자의 아이템이 여러개더라도 각 디바이스에는 알림이 한번만 가게끔 해보자. 먼저 One to Many 관계인 사용자와 아이템을 조인해보자. 아이템이 가지고 있는 fk(사용자의 pk이다)로 조인이 된다. 아이템 하나당 사용자 하나를 가지고 있기 때문에 엔티티 수가 늘어나진 않는다. 여기서 디바이스를 가져오기 위해 사용자-디바이스, One to Many 조인을 해보자. 디바이스 1의 fk는 사용자A의 pk 이다. join은 카티전 곱과 셀렉션 연산의 합이므로 레코드가 뻥튀기 된다. 한 사용자가 아이템을 세개, 디바이스를 네개 가지.. 2021. 3. 10.
로그인 아이디는 왜 pk로 적절하지 않을까? JPA로 엔티티를 설계하던 중 의문이 들었다. 보통 PK는 @GeneratedValue 어노테이션으로 artificial key를 사용한다. 계정 정보를 나타내는 엔티티는 로그인 아이디를 컬럼으로 가지고 있고, 그 컬럼은 Updatable = false, unique = true, nullable = false를 제약조건을 가지고 있다. 그렇다면 변경이 불가능하고, 유일하고, 값이 있어야 하는 로그인 아이디는 PK와 비슷해보인다. 그렇다면 로그인 아이디를 PK로 사용하면 되지 않을까? 인프런에서 JPA 수업을 들었던 김영한 팀장님께 물어봤다. 언제나 친절하게 답변해주신다. 대부분의 사이트들이 고객 id를 PK로 잡지않는다고 한다. 로그인 아이디는 비지니스 로직과는 무관해보이지만 그렇지 않다. login .. 2021. 3. 4.
Base64는 왜 쓰는 것일까? Base64를 처음 들어본다면 이 글을 보길 바란다. https://effectivesquid.tistory.com/m/entry/Base64-인코딩이란 Base64 인코딩이란?인코딩이란? Base64 인코딩에 대해 알아보기전에 먼저 인코딩이란게 무엇인지 간략하게 알아보자. 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위effectivesquid.tistory.com Jwt를 보다보면 JwtProvider에서 jwt.secret을 base64로 인코딩한다. 왜 base64로 인코딩하는지 이해가 안가서 여러 글들을 찾아봤는데 명쾌하지가 않다. 왜 base64 인코딩을 쓰는지 곰곰히 생각하면서 정리한 결론을 소개한다. 밑에 세줄요약도 있다. 먼저 b.. 2021. 2. 12.
HTTP API - PATCH는 멱등한가? 출처 : www.inflearn.com/questions/110644 2021. 1. 11.