본문 바로가기

Programing

(378)
Spring Boot: JPA(Hibernate) 네이밍 전략 spring.jpa.hibernate.naming.physical-strategy 및 spring.jpa.hibernate.naming.implicit-strategy 을 통해 테이블 이름이나 컬럼 이름에 대한 네이밍 전략 설정이 가능하다. 네이밍 컨벤션에는 여러가지가 있다. camelCase: 앞자는 소문자 단어 사이에 대문자 PascalCase: camleCase와 같은데 첫 글자가 대문자이다. Initial Capitals, Initial Caps, InitCaps 로도 불린다. snake_case: 모든 문자는 소문자(lowercase)로 단어간 구분은 언더스코어(_)로 구분한다. kebab-case: 모든 문자는 소문자(lowercase)로 단어간 구분은 대시(-)로 구분한다. ALL CAPS:..
ServletModelAttributeMethodProcessor 와 @PathVariable ServletModelAttributeMethodProcessor 은 ModelAttributeMethodProcessor 상속받아 서블릿을 위한 위한 구현체이다. 가령 Spring MVC 에서 @PathVariable 을 이용해 URI 템플릿을 파라미터로 받아올 때 ServletModelAttributeMethodProcessor 가 사용된다. 사례 예로 아래와 같은 코드가 있을 때 requestNo 과 memberNo 에는 URI path의 템플릿 값이 들어오게 된다. @RestController public class VPNController { @GetMapping(value = "/vpn/{memberNo}/{requestNo}", produces = MediaType.APPLICATION_JS..
@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 에서 프로젝트를 만들면 단일 모듈 기반의 프로젝트를 생성한다. 처음에는 이 구조가 편하지만 단점도 있다. 바로 도메인과 구현 기술의 코드가 섞이게 된다는 것이다. 물론 언어에서는 패키지나 네임스페이스 등의 모듈을 분리할 수 있는 구조를 제공한다. 하지만 이것은 구조화적인 것으로 의존성에 대해 직접적인 통제를 할 수 없다. 헥사고날 아키텍처라고 불리는 '포트와 어댑터'라는 구조가 있기는 하지만 나는 페리페리크 안티 패턴(Périphérique anti-pattern)을 더 선호한다. 파리의 Boulevard Périphérique 에서 따온 메타포이다. 사실 A86이나 La Francilienne 와 같은 더 많은 외곽순환 도로가 경계(boundary)를 나누고 있다. 왜냐..
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..