전체 글

전체 글

    [Spring] @Transactional -> 같은 클래스 내 메서드 호출 시 트랜잭션 전파 안되는 이슈

    [Spring] @Transactional -> 같은 클래스 내 메서드 호출 시 트랜잭션 전파 안되는 이슈

    여기 간단한 서비스 클래스가 있다.@Serviceclass UserService( private val userRepository: UserRepository, private val teamService: TeamService,) { @Transactional(propagation = Propagation.REQUIRED) fun saveUser(user: User) { teamService.saveTeam(user.team) userRepository.save(user) }}@Serviceclass TeamService( private val teamRepository: TeamRepository,) { @Transactional(propa..

    [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..