본문 바로가기

Programing

(393)
@NotNull이 Needs Work가 필요한 수준인가요? 코드 리뷰를 하다가 제목과 같은 질문을 받았다. @NotNull이 Needs Work가 필요한 수준인가요? 사업자등록번호에 대한 유효성 제약 수정이 있어서 PR을 받았는데 의견을 남기고 추가적인 작업이 필요할 것 같아서 Needs Work 로 마크를 했었다. 아래와 같은 요청 파라미터로 사용되는 객체이다. (실무 코드는 아니고 예제이다.) import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @Setter public class MemberJoinRequest implements Member { @NotN..
Spring boot: HttpMessageConverters 는 누가 만들어줄까? RestTemplate 에 대해 통합 테스트를 만드는 과정에서 HttpMessageConverters 빈이 없다고 에러가 났다. 그러면 이 HttpMessageConverters 빈은 누가 만들어주고 있었을까? 스프링 부트에는 여러 Auto Configuration 이 있는데 HttpMessageConvertersAutoConfiguration 가 해주고 있었다. package org.springframework.boot.autoconfigure.http; @Configuration @ConditionalOnClass(HttpMessageConverter.class) @AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.c..
Kotlin DSL Gradle: 멀티 모듈로 변경하기 단일 모듈 기반의 프로젝트 spring initializr 에서 프로젝트를 만들면 기본적으로 단일 모듈 기반의 프로젝트를 생성한다. 이 구조는 단순하고 만들기 쉽지만 단점도 있다. 핵심 비즈니스 구현을 하는 도메인 영역과 세부사항의 일종인 구현 기술의 코드가 섞이게 되기 때문이다. 실무를 하면서 일종의 기술 영역인 JPA의 Entity 가 도메인 영역인 서비스를 통과해 Controller 까지 전달했던 것을 본 적이 있다. 물론 자바나 코틀린에서는 패키지를 구분하여 모듈을 분리할 수 있는 구조를 제공한다. 하지만 이것은 구조화적인 것으로 의존성에 대해 직접적인 통제를 할 수 없다. 페리페리크 안티 패턴(Périphérique anti-pattern) 헥사고날 아키텍처 - 혹은 '포트와 어댑터' - 라는 ..
DataIntegrityViolationException Sentry 로 알림이 오면 팀에서는 습관적으로 ignore 처리를 하는 것을 발견했다. 특히 배포 직후에는 이런 ignore가 빈번했는데 새로운 버전이 배포가 되면 기존의 custom ignore가 무효화가 되는 것 같았다. 백로그의 티켓 중 내부 개선 에픽이 붙어있는 묵혀놓은 티켓을 발견했다. 바로 "정상적인 케이스의 알람을 받지 않는다."이다. 위의 알람의 경우 사용자가 입력을 짧은 시간에 여러번 하여 save 명령이 두 번이 된 경우에 주로 발생했다. DB에는 UC(Unique Constraint) 조건이 달려있었기에 나중에 요청이 온 쿼리가 수행이 되지 않는다. 버튼을 클릭 후 disable로 변경시켜 입력을 두 번하는 것을 막는 것이 근본적인 방향이겠지만 해당 UI는 다른 팀이 담당하고 있어서..
spring-boot 신규 프로젝트 BY spring initializr 회사에서 신규 프로젝트를 진행하게 되었다. 새 술은 새부대에 부으라는 말 처럼 spring initializr를 이용해서 새 프로젝트를 만들었다. 전에 N사에 면접을 봤을 때 어떤 조직장이 코틀린을 써봤냐고 물어본 적이 있었다. 당시 코틀린을 실제 업무 프로젝트에서의 경험이 없어서 사실대로 이야기 했는데 개인적으로 아쉬움이 남았다. 그래서 이번에는 신규 프로젝트 니 Java 대신 Kotlin 으로 해보았으면 바람을 반영했다. 그런데 Language를 Kotlin으로 선택을 하고 Gradle Project로 생성을 했더니 build.gradle이 아닌 build.gradle.kts 파일이 생성되었다. 넌 뭐냐 build.gradle.kts 검색을 해보니 이 형태가 Kotlin DSL 이라는 것을 찾을 수 ..
[스프링] MVC - @RequestBody 객체의 Setter가 필요한가? 주의: 이 글은 jackson-databind 2.8.11.11 기준으로 작성되어 있습니다! 버전에 따라 실제 구현 내용은 바뀔 수 있으니 참고용으로 읽기를 바랍니다. 3줄요약 1. Immutable 객체는 좋은 습관이다. 하지만 절대적인 최선이란 없고 최선의 실천방법(Best Practice)는 상대적이다. 2. Request 객체에 Setter가 없어도 값은 필드 주입이 된다. 3. 필드 주입의 경우 리플렉션에 의한 처리가 되어 Setter가 있는 경우보다 오버헤드가 있을 수 있다. 코드리뷰 코드리뷰를 하다가 getter만 존재하는 @RequestBody 객체를 보았다. (HTTP POST 요청) 불변에 대한 장점들이 많이 알려져 있기에 VO나 DTO 같은 객체는 불변으로 만드는 편이다. @Sette..
System.out 의 성능? 마이그레이션을 위한 임시 코드로 로깅을 위해 System.out.println 을 사용했다. Q. 예외상황이긴 하지만, 최대 size가 1000개일텐데, System.out.println 괜찮을까요? 여기에 세 고개가 더 붙여졌다. Q2. 왜 "System.out.println 안 괜찮을까요?" Q3. 성능? Q4.어떤 성능이요? 지금은 절판된 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기에도 11번 "로그는 반드시 필요한 내용만 찍자" 부분에서 System.out.print 사용에 관련된 내용이 있어서 내용의 요지는 이해했으나 상기 차원에서 검색을 해서 기록해 두었다. 출처: Java - System.out effect on performance 관점1. println 은 synchronized 로 동..
Mockito use case 이미 잘 정리가 되어 있어서 링크로 대신... Mocking Exception Throwing (Baeldung)