legacy/Spring
-
[Spring] JdbcTemplate을 사용하여 DB에 저장할 때, 키(PK) 값 가져오기legacy/Spring 2023. 11. 1. 17:16
원인 Repository를 테스트할 때 key 값에 null이 저장되어 있어 DB 조회가 불가능한 상황이다. DB DB의 키(PK) 값은 auto_increment 전략을 사용하고 있다. Application 시점에서는 DB에 값을 저장하더라도 키 값을 알 수가 없다. 이는 테스트 코드에서 DB에 정상적으로 저장됐는지 확인하는 과정에서 문제가 발생한다. Application jdbcTemplate.update("INSERT INTO Member(login_id, name, password) VALUES(?, ?, ?)",member.getLoginId(), member.getName(), member.getPassword()); JdbcTemplate을 사용하여 DB에 Member 객체를 저장하였다. T..
-
[Spring] Dependency 모음legacy/Spring 2023. 10. 31. 16:39
Test에서 Lombok 사용 //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' MySQL runtimeOnly 'mysql:mysql-connector-java' Jdbc DataSource 사용하려면 필요 implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
-
[Spring] 트랜잭션 전파, Propagation.REQUIRES_NEWlegacy/Spring 2023. 9. 6. 14:03
앞서 여기서 외부 트랜잭션과 내부 트랜잭션에 대해 설명하였다. 트랜잭션 참여에 대해서 설명을 하였는데, 이번에는 트랜잭션 참여가 아닌 새로운 트랜잭션 생성에 대해서 알아보자. 트랜잭션 참여 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRED를 사용한다. @Transactional(propagation = Propagation.REQUIRED) public class MemberRepository { // 생략 } 새로운 트랜잭션 생성 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRES_NEW를 사용한다. @Transactional(propagation = Propagation.REQUIR..
-
[Spring] @Transactional과 UnexpectedRollbackExceptionlegacy/Spring 2023. 9. 6. 13:34
트랜잭션 전파를 공부하면 내부 트랜잭션과 외부 트랜잭션을 공부하게 되는데, 이때 내부 트랜잭션에서 롤백이 호출되었을 때 외부 트랜잭션에서 이를 처리하는 2가지 경우가 존재한다. 외부 트랜잭션 트랜잭션이 시작된 곳을 외부 트랜잭션이라고 한다. 외부 트랜잭션이 최종적으로 커밋 또는 롤백을 처리한다. 내부 트랜잭션 외부 트랜잭션에 참여하는 트랜잭션을 내부 트랜잭션이라고 한다. 내부 트랜잭션에서 발생한 커밋 또는 롤백은 실제로 호출되지 않는다. 커넥션은 단 한 번만 커밋 또는 롤백이 가능하기 때문에, 내부 트랜잭션에서 커밋 또는 롤백을 호출하면 외부 트랜잭션까지 트랜잭션이 사용되지 않고 중간에 종료되는 문제가 발생한다. 예외 1 - RuntimeException MemberService에서 MemberRepos..
-
[Spring] @PostConstruct와 @Transactionallegacy/Spring 2023. 9. 5. 01:47
@PostConstruct와 @Transactional이 동시에 사용되었을 때 트랜잭션이 적용되지 않는다. 그 이유는 두 애너테이션이 호출되는 시점이 다르기 때문이다. 스프링 생명 주기 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 컨테이너 종료 @PostConstruct 호출 시점 스프링 빈이 생성 되고 의존 관계가 주입된 후에 호출된다. @Transactional 호출 시점 초기화 콜백 이후 컨테이너가 초기화된 후에 호출된다. 코드 Hello 클래스가 빈으로 등록되어 있고, initV1() 메서드에 @PostConstruct 애너테이션이 사용되고 있다. @SpringBootTest @Slf4j public class InitT..
-
[Spring] @Transactional 적용 범위legacy/Spring 2023. 9. 4. 23:00
클래스에 @Transactional을 붙이면 모든 메서드에 트랜잭션이 적용된다. 특정 메서드에 @Transactional을 붙이면 해당 메서드에만 트랜잭션이 적용된다. 그런데 의문이 들었다. @Transactional이 붙지 않은 메서드를 호출할 때, 해당 클래스는 AOP 프록시가 적용되어 있는지에 대해 궁금했다. 결론부터 말하자면 AOP 프록시가 적용된 상태에서 메서드를 호출하게 된다. 물론 @Transactional이 붙지 않았기 때문에 해당 메서드는 트랜잭션이 적용되지 않는다. 트랜잭션 AOP 적용 CallService 클래스를 보면 internal 메서드에 @Transactional이 붙었다. 따라서 해당 클래스는 AOP 프록시가 적용된다. AOP 프록시가 적용된다는 의미는 프록시 객체가 트랜잭션..