오늘의 기록

    [Kotlin] @JvmOverloads - 생성자/함수 손쉽게 오버로딩

    [Kotlin] @JvmOverloads - 생성자/함수 손쉽게 오버로딩

    Kotlin으로 생성자를 만들 때, 다음과 같이 default value를 지정할 수 있다.data class TestDto( val one: String = "1", val two: String = "12", val three: String = "123",) 생성자를 사용하는 곳에서도 다음과 같이 파라미터를 직접 명시해서 편하게 생성자를 호출할 수 있다.TestDto(one = "1", three = "234")-> 이러면 two 프로퍼티에는 default value가 들어간다. 그러나 java에서 kotlin의 객체를 사용한다면?  이렇게 전체 생성자 혹은 기본 생성자만 생성할 수 있게 된다.kotlin처럼 유연하게 생성자를 만들고 싶어서, 각 케이스별로 kotlin에 부 생성자를 정..

    [Spring] ObjectMapper -> Jackson2ObjectMapperBuilder vs 생성자

    1. 기본생성자가 없는 객체에 대한 역직렬화 차이여기 객체 1개가 있다.@Getter@AllArgsConstructorpublic class TestDto {    private String id;} 기본생성자가 없는 객체를 만들었다. 직렬화/역직렬화 테스트를 해보자.@RestControllerpublic class TestController {    @GetMapping    public TestDto test(@RequestBody TestDto dto) {        return dto;    }}// input{    "id": "1"}// output{    "id": "1"}문제 없이 성공한다. 성공하는 이유는 JacksonHttpMessageConvertersConfiguration 클래스..

    [Spring] jackson 역직렬화, 필드가 1개일 때 HttpMessageNotReadableException

    jackson 2.17 문제 상황개발환경java 21spring 3.3.0jackson 2.17.1 다음과 같은 java 코드가 있다.@RestControllerpublic class TestController { @GetMapping public TestDto test(@RequestBody TestDto dto) { return dto; }}@Getter@AllArgsConstructorpublic class TestDto { private String id;} 1. TestDto는 필드가 1개 & 기본 생성자 없이 전체 생성자만 갖고 있다.2. 컨트롤러에서는 필드가 1개인 TestDto를 @RequestBody로 역직렬화해야 한다. HttpMessageNotRead..

    [Spring] Pointcut 유형에 따라 Proxy 생성 방식이 달라진다? (CGLIB or JDK Proxy)

    [Spring] Pointcut 유형에 따라 Proxy 생성 방식이 달라진다? (CGLIB or JDK Proxy)

    "토비의 스프링 3.1 Vol.1 > 6.5.3 포인트컷 표현식을 이용한 포인트컷"을 공부하면서 배운 부분을 기록. 여기 프록시 관련 빈 설정 파일이 있다.@Configurationclass BeanConfig { @Bean fun userService(): UserService = UserServiceImpl(userLevelUpgradePolicy(), userDao()) @Bean fun defaultAdvisorAutoProxyCreator(): DefaultAdvisorAutoProxyCreator = DefaultAdvisorAutoProxyCreator() @Bean fun transactionAdvisor(): DefaultPointcutAdvisor = ..

    [Spring] junit test에서 lombok 사용하는 방법

    만약 lombok을 junit test에서 사용할 수 없다면?build.gradle 파일에 다음 조건이 추가됐는지 확인해보자.dependencies { compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") ... // Lombok을 테스트 환경에서도 사용하기 위한 추가 설정 testCompileOnly("org.projectlombok:lombok") testAnnotationProcessor("org.projectlombok:lombok")}-> Lombok의 애노테이션 프로세서가 테스트 코드에서도 동작하게 하자.

    [JPA] drop table if exists user cascade " via JDBC

    -> User 엔티티 클래스를 ddl-auto: create로 자동 DDL 생성을 하면 발생하는 오류 메시지다.-> h2에서 "user"라는 키워드가 예약어라서 그렇다.-> 엔티티에 @Table(name="users")로 테이블명을 "users"로 변경하면 해결할 수 있다.

    [Kotlin] Private primary constructor is exposed via the generated 'copy()' method of a 'data' class.

    문제kotlin에서는 toString(), equals(), hashCode()를 편하게 사용하기 위해 data class를 많이 사용한다.또한, 어떤 객체에 정적 팩토리 메서드를 추가하면, 보통 생성자는 private 처리하는 경우가 많다.다음은 data class + 정적 팩토리 메서드 + private 생성자를 적용한 예제이다.data class Customer private constructor( val id: String, val name: String,) { companion object { fun of(id: String, name: String): Customer { verifyIdFormat(id) return Custo..

    [Kotlin] JPA 플러그인 정리

    기본 생성자@Entity 클래스는 기본 생성자를 가져야 한다.why? JPA의 구현체인 hibernate는 기본생성자(protected 이상) + Reflection을 이용해 엔티티를 생성한다. 보통 kotlin 클래스는 다음과 같이 정의 하는데,@Entityclass Customer private constructor( @EmbeddedId val id: CustomerId, var password: CustomerPassword, var name: String,)이러면 기본 생성자가 안생기니, 별도로 기본 생성자를 정의해줘야 하나 싶다.-> kotlin-jpa 플러그인을 추가하면 @Entity, @MappedSuperClass, @Embeddable 클래스에 기본 생성자를 생성해..