본문 바로가기

전체 글

(17)
[Java record] Lombok의 @Builder.Default 대신 컴팩트(Compact) 생성자를 사용하여 필드 기본값 설정하기 java의 record 타입이 궁금하다면 37편. 레코드(Record) 이 글을 추천합니다. Java의 기본 클래스(+ Lombok)로 만들어진 DTO를 record 타입으로 변환하다 필드에 기본값을 설정해야 하는 상황을 마주했다. 기존 DTO 클래스는 아래와 같다. @Builder @Getter @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class CarsDto { @Builder.Default List values = new ArrayList(); Integer speed = 10; } Lombok의 @Builder.Default를 사용하여 빌더에서 값을 지정하지 않은 경우에 기본값이 들어가도록 해두었다. 하지만 reco..
boolean 타입 'is' 생략 없이 json 직렬화하기 (with Lombok) 문제 간단한 controller를 만들다 원시 타입의 boolean을 json으로 직렬화하는 과정에서 문제가 생겼다. DTO의 필드명이 isXXX였는데 is가 자꾸 빠져서 직렬화되었다. 실패한 첫 접근 방법 : @JsonProperty를 사용해보자! @JsonProperty는 json 필드의 이름을 지정할 수 있는 애노테이션이다. 이를 통해 이름을 'isXXX'로 지정해두면 이 문제를 쉽게 해결할 수 있을줄 알았다. 하지만.. 갑자기 json에 good과 isGood 두 개의 값이 생겼다. 원인은 롬복의 @Getter 애노테이션이었다. 이 현상을 이해하려면 먼저 두 가지 사실을 알아야 한다. 1. Jackson은 기본적으로 직렬화, 역직렬화 과정에서 getter/setter를 이용한다. 2. 롬복의 @G..
[Java] 기본 생성자가 필요한 '진짜' 이유 (리플렉션 오해 바로 잡기!!!) '기본 생성자가 필요한 이유'라고 검색해보면 여러 블로그에서 하나같이 하는 소리가 있다. 기본 생성자가 필요한 이유는 Reflection API로 가져올 수 없는 정보 중 하나가 생성자의 인자 정보이기 때문이다. 나도 처음엔 진짜 그런줄 알았다. 이 내용 그대로 테코톡 발표까지 할뻔했으니.. 기본 생성자가 필요한 '진짜' 이유를 알아보기 전에 간단히 리플렉션이 뭔지부터 알아보도록 하자. 리플렉션이 뭔지 궁금하지 않다면 넘어가도 좋다. 리플렉션이란? 리플렉션을 한글로 번역하면 '거울에 비친 상, 모습'이라는 의미이다. 우리가 거울을 통해 내 모습을 확인하는 것처럼 실체가 아닌 거울에 반사, 반영된 이미지를 통해 어떠한 행위를 하는 것이 리플렉션이라 볼 수 있겠다. 그렇다면 자바 세상에서는 무엇이, 어디에 ..
Connection Pool과 적절한 Size 설정하기 (with HikariCP) Connection 유저가 보낸 요청을 처리하는 과정에서 서버(WAS)가 DB에 접근하기 위해서는 Connection 타입의 DB 연결을 위한 객체가 필요합니다. DriverManager JDBC에서는 DriverManager를 사용하면 Connection 을 아래와 같이 가져올 수 있습니다. Connection connection = DriverManager.getConnection(DB_URL, USER, PASSWORD) Connection은 생성 비용이 크다 하지만 이런식으로 DB에 접근할 때마다 Connection을 생성하는 것은 비효율적입니다. Connection을 생성하는 데 비용이 많이 들기 때문입니다. // 행을 insert하는 데 드는 시간 (괄호 안의 숫자는 비율을 나타낸다) // 연..
Java EE와 톰캣, 스프링의 관계 톰캣에 대해 공부하다 보니 계속 나오는 단어가 있었습니다. 바로 JAVA EE. 대체 JAVA EE가 뭘까요? 톰캣은 뭐고 스프링과는 어떤 관계일까요? 단순히 톰캣만 알아볼 게 아니라 이 세 친구들 간의 관계를 명확히 이해해야 각각의 역할도 확실히 알 수 있겠다는 생각이 들어 찾아보기 시작했습니다. 먼저 JAVA EE가 무엇인지 알아봅시다. Java EE (Java Platform, Enterprise Edition) Java EE는 기업용 애플리케이션에 필요한 기능들의 사양을 정의해둔 명세서라고 할 수 있습니다. 구체적으로는 JSP, Servlet, EJB, JDBC 등 기업용 애플리케이션을 개발하고 실행하는 데 필요한 사양들을 명시하고 있습니다. 이 사양을 각 vendor 사들이 구현하여 판매하면 개..
[회고] 우테코 레벨 3 회고 - (2) 근로와 테코톡 지원플랫폼 근로 코틀린 DSL로 인수테스트 픽스쳐 만들기 (혹은 Controller 리팩토링..) 레벨 2가 끝날 때쯤 본격적인 태스크를 배정받았다. 그건 바로 코틀린 DSL로 인수테스트 픽스쳐 만들기! 처음부터 쉽지 않을 거라는 예상은 했었지만... 예상보다 10배는 더 쉽지 않은 여정이었다. 우선 페어인 애쉬와 처음 만나 도메인 파악부터 시작했다. 어느정도 도메인을 안다고 생각했는데 자세히 살펴보니 도메인 이름부터 용도까지 전체를 파악하는 게 쉽지 않았다. 처음에 도메인을 확실히 정리하고 가니 그 뒤에 도메인을 몰라서 헷갈리거나 막히는 일은 없었다. 하지만 픽스쳐를 만드는 과정에서 수많은 벽에 부딪혔다. 자세한 내용은 쓰면 안 될 수도 있어서 대충 써보자면 이렇다. 1. 저장 api가... 2. 단건..
[회고] 우테코 레벨 3 회고 - (1) 🌈달록 팀 프로젝트 참 늦게 올리는 회고다. 원래 2주마다 회고를 쓸 계획이었지만 미루고 미루다 2달치 회고를 한 번에 하게 됐다. 사실 이것도 레벨로그 쓰기 싫어서 시작했다. 1차 데모 - 달록의 팀 문화 첫 만남은 저번 일기에 적혀 있으니 생략한다. 1주 차 때 우리 팀은 팀 문화를 만드는 데 공을 많이 들였다. 코드 컨벤션부터 스프린트 방식, 깃헙 사용 방식 등 정해야 할 것들이 산더미였다. 팀 문화, 팀 규칙을 정하는 데에만 최소 3일은 통째로 쓴 것 같다. 그렇게 만들어진 달록의 팀 규칙 & 문화는.. 너무 많으니 1차 데모데이 영상을 참고하길. 그 중에 특별하거나 만족도가 높았던 문화 몇 가지만 짚어보자. 1. 달록 기술 블로그 처음 매트가 팀 기술 블로그를 제안했을 때 나는 걱정이 앞섰다. 이미 개인 블로그를..
[JPA] Auditing auditing이란 엔티티와 관련된 이벤트(insert, update, delete)를 추적하고 기록하는 것을 의미한다. 모든 엔티티에 생성일시, 수정일시, 생성한 사람을 추가하고 싶은 경우를 생각해보자. 모든 엔티티에 생성일시, 수정일시, 생성한 사람에 대한 필드를 일일이 구현해주어야 한다. 이렇게 되면 모든 엔티티에 중복이 생기고 유지보수가 어려워진다. Spring Data JPA가 제공하는 auditing 기능을 사용하면 이런 기능을 쉽고 빠르게 구현할 수 있다. Spring Data JPA Auditing 적용하기 Auditing을 적용하기 위해서는 우선 어노테이션을 적용해야 한다. @Configuration 어노테이션이 적용된 Config 클래스에 아래와 같이 @EnableJpaAuditing ..