객체지향, 자바 & 스프링을 올바르게 공부하고 있는 건가 싶은 의문이 든다면 아래 동영상을 한번 보자 얼마 전 팀장님과 잠깐 나눴던 대화 중 앉아만 있다고 공부하는 것이 아니라는 말씀을 해주셨다 난 2021.02 기준으로 개발 공부를 시작했고 그때부터 약간은 강박적으로 공부에 매달렸다 이전 회사에서도 그랬고 지금도 퇴근 후 적어도 4시간 이상은 하고 주말에 약속이 없다면 거진 10시간 정도를 하는데 그래서 난 공부를 오래 하고, 정말 열심히 한다는 생각을 했던 것 같다 팀장님의 말씀과 위 동영상을 보고나니 의식적인 연습이 부족했구나 하는 생각이 든다 그렇게 긴 시간을 공부하더라도 무의식적인 공부라면 코드 따라 치기 일 뿐이고 잘 봐줘도 API 사용법 학습일 뿐이다 위 동영상에서 말한 것과 팀장님께서 해주..
[AOP] 소요 시간 측정 AOP class level에 적용하기 진행 중인 프로젝트 메서드에 slow query 분석 또는 잘못된 비즈니스 로직을 해결하기 위해 시간 측정 AOP를 활용해봤다 우선 aop 관련 package를 따로 만들어주고 시간 측정할 메서드에 적용시킬 custom ryumodrn.tistory.com 이전 글에 해당하는 내용 지난 버전에서는 LogExecutionTime이라는 custom annotation을 만들고 이 녀석을 적용시킬 수 있는 범위를 클래스까지 추가하여 클래스에 해당 애노테이션을 붙여 시간 측정을 했다 실제 운영 시에는 이와 같이 선별적인 방식으로 시간 측정할 클래스에 애노테이션을 붙여 사용해야 할 것인데 애노테이션을 붙이지 않고 더 간편하게 선별적으로 적용시키는 ..
멀티 모듈 프로젝트에서 의존성 관리는 어렵다 경험 삼아 & 재미로 멀티 모듈 프로젝트를 하고 있는데 의존성 관리를 아래와 같이 해왔다 module-api, module-service 가 module-core에 의존하고 있는 중이다 얼마전 비대해진 root build.gradle의 dependencies를 세분화하여 각각의 모듈 build.gradle로 옮기는 작업을 진행했다 깔끔하게 다이어트 시키고 모듈 별로 필요한 라이브러리에만 의존할 수 있게 만들어 성공적이었다 현재 root build.gradle에서는 위에 지정해준 project(':module') 라인이 빠진 상태고 모듈 별 build.gradle의 dependencies에서 implementation project(':module') 형태로 관..
토요일에 정말 오랜만에 친구들과 술 한잔 하고 있었는데 긴급 연락이 왔다 뉴스 링크가 걸려 있었는데 마인크래프트에서 시작한 java logging framework의 문제에 관한 기사였다 밖이라서 바로 대응은 못 했는데 logback 쓰고 있던 게 기억나서 더 찾아보았다 원격으로 코드를 밀어 넣을 수 있어 엄청난 문제긴 한데 특정 버전 (2.0-beta9 ~ 2.14.1)에만 해당하는 문제다 다행히 log4j2의 1.x 버전과 logback은 해당 사항 없어서 별 다른 대응 없이 잘 지나갈 수 있었다 원인으로는 log4j-core 모듈이라는데 대충 찾아본 바에 따르면 유연성과 편의 기능을 위해 작성된 코드로 인해 SQL injection 마냥 코드가 들어와서 실행되는 게 문제라고 한다 개인적으로 진행하는..
Springboot + Gradle 조합을 사용한다면 소규모 이상의 프로젝트에서 적용할 수 있는 꿀팁이 있다 프로젝트 루트 경로에 있는 .gradle 폴더 안에 gradle.yml을 이용해 캐싱, 병렬 실행, jvm memory 설정을 줄 수 있다 gradle.properties 도 가능하지만 가독성 & 중복 제거 측면에서 yml을 쓰는 것이 낫다 더 멋들어진 설정이 있나 찾아봤었는데 대충 요 정도만 쓰는 거 같다 .gradle/gradle.yml org: gradle: daemon: true caching: true parallel: true jvmargs: -Xmx2048m configureondemand: true gradle.yml을 작성했다면 터미널에서 아래 명령어들을 이용해 프로젝트 전체 테스..
테스트를 돌리는 방법에는 아래 사진과 같이 테스트 폴더 자체를 선택해 Run을 눌러 돌리는 방법이 있고 명령어를 통해 전체 테스트를 돌리는 방법이 있다 단일 모듈 구조라면 테스트 폴더로만 돌리는 게 쉽고 빠르다 멀티 모듈 프로젝트의 경우에도 폴더를 이용해 돌려도 되지만 명령어를 통해 돌리면 빌드 수행 후 전체 테스트 코드가 한방에 돌아가기 때문에 편의성 측면에서 더 낫다 특히나 --parallel 옵션을 줘서 병렬로 수행할 수 있게 만들 수 있다 ./gradlew test --parallel org.springframework.dao.DataIntegrityViolationException 테스트 코드 작성 중 만난 오늘의 에러다 소스 관리를 위해 Github Actions를 써서 빌드&테스트 수행 후 ..
내 프로젝트에는 Member, Product, Cart domain이 존재한다 Cart는 Member를 N : 1 & Product를 1 : 1로 가지고 있는 Entity이다 이 상황에서 Cart를 응답하기 위한 CartResponse로 변환하고 GenericMapper를 그대로 쓰면 어떻게 될까? 당연히 Cart의 속성 member와 product가 그대로 나간다 변화 가능성이 큰 Entity로 응답하지 않기 위해 DTO 형태로 만들어 반환하는 것인데 현재의 DTO는 이를 위반한다 기존의 GenericMapper를 이용하며 member와 product도 dto 형태로 만들어 반환해줘야한다 약간의 커스텀 작업이 필요하다 우선 CartResponse에 Entity가 아닌 DTO 형태를 명시해준다 Gener..
요즘 클린 코드와 유튜브 클린 코더스 강의를 보며 테스트 코드 작성을 연습 중이다 테스트 코드 개수가 늘어가면서 뿌듯하기도 하고 사람들이 왜 TDD에 열광하는지 알 것 같다 예전에는 테스트 코드 없이 바로 로직을 작성하고 문제가 생기면 스택 트레이스를 읽고, 디버거를 통해 문제 해결을 했었다 그런데 지금 진행하는 프로젝트는 4개의 백엔드 모듈과 1개의 프런트엔드 모듈로 구성되어 있어 규모가 작지 않다 이런 경우에는 혼자 진행하더라도 의존성이 어디까지 미칠지 완전히 파악할 수 없다 서비스 계층의 로직을 변경했을 뿐인데 여기저기에 영향을 미쳐 전체 로직이 흔들릴 수도 있다 - 백명석 님의 클린 코더스 강의, 최신 강의는 아니지만 굉장히 좋다! 강추 강추 https://www.youtube.com/watch?..
Springboot 프로젝트를 진행할 때 지루한 entity -> dto 변환 작업을 쉽게 도와줄 수 있는 mapping library들이 있다 대표적으로 model mapper, mapstruct, okari가 존재하는데 나는 성능 상의 이유로 mapstruct를 사용했다 mapping library의 성능 비교 글은 구글링을 하면 쉽게 찾을 수 있다 mapstruct는 롬복처럼 컴파일 시점에 annotation-processor에 의해 변환되기 때문에 성능이 가장 우수하다 다른 mapping library들은 런타임 시점에 리플렉션을 통해 매핑하기 때문에 성능에 부하가 올 수 있다 사용법은 okari는 성능이 가장 안 좋다고 하여 사용해본 적이 없어서 패스하고, mapstruct보다 model map..
진행 중인 프로젝트 메서드에 slow query 분석 또는 잘못된 비즈니스 로직을 해결하기 위해 시간 측정 AOP를 활용해봤다 우선 aop 관련 package를 따로 만들어주고 시간 측정할 메서드에 적용시킬 custom annotation을 만들어 준다 AOP 활용을 위해 구글링 하면 보통의 블로그에서는 method level에 적용시키는 방법만 알려주고 있다 나는 단순히 몇 개의 메서드에만 적용시킬 게 아니라 코드 프리징과 배포를 하기 바로 직전까지 문제 해결을 위해 시간 측정을 계속할 계획을 가지고 있다 따라서 나와 같은 상황에서 시간 측정을 위해서라면 @LogExecutionTime 애너테이션을 모든 메서드에 달아줘야 한다 사실 애너테이션만 달아주면 해결되는 문제니 별 신경을 쓰지 않을 수도 있겠지..