Author: 지기

[Java]List 복사하는 방법

List를 복사하는 4가지 방법 위 4가지 모두 요소의 참조주소를 복사하는 얕은복사(Shallow Copy) 방법이다.객체의 참조값도 모두 새로 생성하는 깊은복사(Deep Copy)를 하고 싶은 경우 개발자가 직접 구현해야한다.(반복문 사용 등) 예제코드는 아래를 참조하자.

[Spring]트랜잭션 예외복구 시 주의사항

2개 이상의 트랜잭션을 1개의 트랜잭션으로 수행 시, 어느 한 개의 트랜잭션에서 롤백이 발생하면 모든 트랜잭션이 rollback 되는 것이 스프링 트랜잭션의 대원칙이다. 그런데 경우에 따라 어느 트랜잭션에서는 try… catch로 예외를 처리할 수 있다. 이 경우...

[Spring]트랜잭션의 전파옵션

스프링에서 트랜잭션의 전파옵션에 대해서 알아보자. 디폴트 값은 REQUIRED 이다. REQUIRED가장 많이 사용하는 기본 설정이다. 기존 트랜잭션 없음: 새로운 트랜잭션을 생성한다.기존 트랜잭션 있음: 기존 트랜잭션에 참여한다. REQUIRES_NEW항상 새로운 트랜잭션을 생성한다. SUPPORT트랜잭션을 지원한다는 뜻이다.기존 트랜잭션 없음:...

[Spring]트랜잭션의 전파

스프링에서는 2개의 트랜잭션이 중첩되어 있을 때, 이를 propgation(전파) 옵션으로 제어할 수 있다. 트랜잭션의 중첩은 이미 트랜잭션이 진행중인 상황에서 추가로 트랜잭션을 수행하는 경우를 말한다. 아래와 같은 상황을 말한다. 트랜잭션의 중첩 여기서 외부 트랜잭션은 로그내용 중...

[Spring]스프링 트랜잭션 전파의 기본원칙

스프링에서는 트랜잭션을 물리 트랜잭션, 논리 트랜잭션으로 구분한다. 스프링에서는 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋된다. (기본 전파레벨 : required) 하나의 논리 트랜잭션이라도 롤백이 발생하면 물리 트랜잭션은 롤백된다. (모든 논리트랜잭션이 롤백된다.)

[Spring]@Transactional에서 예외발생 시 커밋과 롤백

스프링의 트랜잭션 AOP에서는 예외의 종류에 따라 트랜잭션을 커밋하거나 롤백한다. 예외 구분 트랜잭션 Object Throwable Error LinkageError 롤백 ThreadDeath 롤백 .. 기타 에러 롤백 Exception RuntimeException unChecked 롤백 SQLException checked 커밋 … 기타 예외 checked...

[Spring]@Transactional 사용 시 주의사항

스프링에서의 @Transactional은 기본적으로 프록시방식의 AOP를 사용한다. 호출순서는 아래와 같다. 클라이언트 -> 프록시 호출 -> 프록시 @Transactional 메서드 호출 -> 트랜잭션 적용 -> target 호출 -> target 메서드 호출 그런데 target 내부에서 메서드 호출이 발생하면...

[Spring]@Transactional 적용 우선순위

클래스의 메서드(우선순위 높음) > 클래스의 타입 > 인터페이스의 메서드 > 안터페이스의 타입(우선순위 낮음) 위 4군데에 모두 @Transactional이 사용되었다면, 클래스의 메서드의 @Trnasactional을 가장 먼저 사용한다. 스프링에서는 보통 “구체적인 것”이 “추상화된 것”보다 높은 우선순위를 가진다. @Transactional...

[Spring Data JPA]쿼리 메소드 기능

Spring Data JPA에서 제공해주는 기능 중 메소드명으로 쿼리를 가능하게 해주는 기술이 있다. 자주 쓰는 기술 몇 가지에 대해 알아보자. 참고 : __ 은 생략 가능하다. 더 자세한 것은 공식사이트를 참조하자. (공식사이트) Keyword Sample JPQL...

[Java]문자열 자릿수 맞추기(LPAD, RPAD)

문자열에 패딩을 추가하여 자릿수 맞추는 2가지 방법을 알아보자 첫 번째. String.format() 을 사용하는 방법 두 번째. StringUtils 라이브러리를 사용하는 방법 String.format() 사용 StringUtils 라이브러리를 사용

[Spring]@Repository 기능

Spring에서 데이터 엑세스 클래스에 주로 사용하는 @Repository의 2가지 기능에 대해 알아보자. JPA의 EntityManager를 이용하여 DB 엑세스 시 예외가 발생하면 JPA에서 정의한 예외(PersistenceException)가 발생한다. 하지만 @Repository가 적용되면, 이를 Spring의 DataAccessException으로 자동으로 변환시켜 준다. 이는 PersistenceExceptionTranslater라는...

[Mybatis]동적 프록시 기술

Mybatis를 사용할 때 interface에 @Mapper를 적용하고 구현체를 개발자가 구현하지 않고도 사용가능하다. 그 이유는 스프링이 로드 될 때, Mybatis의 연동객체가 자동으로 xml을 읽어와 해당 Mapper의 구현체를 스프링빈으로 등록해 주기 때문이다. 해당 Mapper의 클래스를 로그로 찍어보면...

[Java]@Mock 또는 @Spy를 지정했는데 Object가 null로 초기화 될 때

SpringBoot에서 단위테스트를 진행할 때, Service 에 @Mock, @Spy 를 적용했는데, 테스트 실행 시 NullPointExceptioin 이 발생하는 경우가 있다. null이 발생한 이유는 간단하다. Mock을 초기화하는 과정이 빠져있어서다. 이 경우 2가지 해결책이 있다. JUnit5와 JUnit4의 차이점은...

[Java]테스트에서 @Transactional 동작특성

SpringBoot 에서 테스트 클래스에 @Transactional 어노테이션을 사용 할 때의 특징 일반적인 상황에서 메서드 성공 시 commit, 실패 시 rollback을 수행하는 것과는 다르게 동작한다. 테스트 시에는 메서드 종료 시 rollback을 실행한다. 서로 다른 테스트에 영향을...

[Java]Map.of(), Map.ofEntries 데이터 초기화

Java 9부터 Map.of(), Map.ofEntries를 사용하여 간단하게 맵을 초기화할 수 있다. Map.of와 Map.ofEntries는 ImmutableCollections 를 반환한다는 것에 주의하자. 한번 초기화하면 map.put()을 이용하여 값을 추가할 수 없다. 추가할 경우 java.lang.UnsupportedOperationException 가 발생한다. 사용방법은 아래와 같다. (key1,...

[Java]JdbcTemplate의 queryForObject()

스프링부트에서 기본으로 제공하는 JdbcTemplate중 queryForObject() 메서드 기본 사용방법을 정리한다. build.gradle에 아래 내용을 추가한다. queryForObject는 1개의 row를 반환한다. 입력 파라미터에 RowMapper<T>를 넣어줘야 하는데, 아래와 같이 람다식을 이용하면 편리하다. queryForObject는 데이터가 null이면 EmptyResultDataAccessException이 발생하므로 try… catch문으로...