개발/Spring
-
spring에서 private 테스트는 어떻게 할까? (feat. ReflectionTestUtils, kotlin)개발/Spring 2022. 3. 27. 23:38
ReflectionTestUtils.getField(target(Object or class), fieldName) as fieldType 테스트코드를 짜다보면 테스트 후 private field가 제대로 바꼈는지 확인하거나 private fun 을 확인하고 싶을때가 있다. 이런경우 spring에 내장되어있는 ReflectionTestUtils 를 사용해서 간단히 테스트를 할 수 있다. https://www.baeldung.com/spring-reflection-test-utils https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html 예를 위해 ..
-
@Transactional 옵션을 사용하지 않는다면?개발/Spring 2022. 3. 7. 02:21
일단 기본적으로 @Transactional 에서 많이 사용되는 readOnly 옵션의 default 는 false이다. 때문에 서비스레벨에서 해당 메서드의 Transaction 관리를 하려고 할때 대부분 @Transactional만 붙이고 있는 것이다. 그렇다면 아무런 옵션도 붙이지 않고 jpa를 사용한다면 어떻게 될까? 우선, spring-data-jpa에서 제공하는 JpaRepository의 기본 구현체는 SimpleJpaRepository이다. 내부를 들여다보면 위에서 알 수 있듯 구현 메서드들의 기본 값은 readonly를 띄고 있다. 이제 C-R-U-D에 대해 알아보자. Create 저장하는 메서드에 대해서는 Transactional옵션을 추가 선언하고 있다. 즉 위 default처럼 reado..
-
@Transactional(readOnly = true)는 필요한가?개발/Spring 2021. 8. 8. 00:03
회사에서 작업하면서 단순히 데이터 목록을 findall을 통해 조회한 값을 리턴하는 메서드에 당연하단 생각으로 @Transactional(readOnly = true) 을 주었었다. 그리고 리뷰를 하는도중 동료가 @Transactional(readOnly = true)의 역할이 무엇인지 물었었고 나는 readOnly=true인 상태이면 영속성 컨텍스트에 관리를 받지않아, 스냅샷 저장. 변경감지 수행등을 하지 않아 성능적으로 나아 이 옵션을 달았다고 답변을 했다. 그리고 이어지는 질문은 그럼 해당 옵션이 아예 없으면 되는데, 왜 필요한가였다. 떠올린 생각과 한 얘기는 1. readonly true일때는 master가 아닌 reader DB로 호출되는 장점이 있지만 현재는 개발단계로 하나의 db만 사용하고 ..
-
spring transaction개발/Spring 2021. 4. 6. 21:48
출처 deveric.tistory.com/86 https://goddaehee.tistory.com/167 글 작성 동기 : 스프링 트랜잭션에 대해 알아보고자 다수의 트랜잭션이 경쟁시 발생할 수 있는 문제 다수의 트랜잭션이 동시에 실행되는 상황에선 트랜잭션 처리방식을 좀 더 고려해야 한다. 예를들어 특정 트랜잭션이 처리중이고 아직 커밋되지 않았는데 다른 트랜잭션이 그 레코드에 접근한 경우 다음과 같은 문제가 발생할 수 있다. ▶ Problem1 - Dirty Read - 트랜잭션 A가 어떤 값을 1에서 2로 변경하고 아직 커밋하지 않은 상황에서 트랜잭션B가 같은 값을 읽는 경우 트랜잭션 B는 2가 조회 된다. - 트랜잭션 B가 2를 조회 한 후 혹시 A가 롤백된면 결국 트랜잭션B는 잘못된 값을 읽게 된 ..
-
junit5 에러 테스트개발/Spring 2021. 3. 21. 13:28
예외를 기대하고 테스트를 할 때가 있다. 이런경우 예제를 찾아보니 1. @Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class) 와 같이 어노테이션을 통해 간단히 테스트를 할 수 있었지만, junit5 환경으로 작업해보면서 되지 않았다. 2. 두번째로는 try catch를 사용하여 테스트를 할 수 있었다. try { userRepository.findByIdAndIsDeleted(1l, false).orElseThrow(()-> new IllegalArgumentException("없는 사용자 id 입니다.")); }catch (IllegalArgumentException e){ Syst..
-
jpa또는 querydsl로 union 쿼리 사용개발/Spring 2021. 2. 25. 18:55
보통 jpa로 불러오다가 좀 더 세밀한 쿼리가 필요하면 querydsl을 사용한다. 이번에 기존 테이블과, 이 테이블의 데이터를 백업한 두 테이블 데이터를 함께 불러와야하는 일이 생겼다. union 쿼리를 사용하면 되는데 jpa에서도, querydsl에서도 union은 지원하지 않는다. (아마 제대로 설계했다면 유니온이 왜 필요해? 라고 되묻는 것 같다.) 그래서 native query로 직접 입력 할 수밖에 없었다. 그래서 모습은 @Query(nativeQuery = true, value = "select * from (" + "select a.id, a.field1, a.field2 from test_tableA a where a.status =?1 union " + "select b.id, b.fi..
-
RequestBody의 데이트 타입 정해진 format으로 받기개발/Spring 2021. 2. 24. 16:51
Spring Restful 컨트롤러에서 클라이언트로부터 json타입의 객체를 받는 경우 Jackson 메세지 컨버터 클래스에서 객체 변환 작업이 일어난다. 나 같은 경우 커스텀된 타임 포맷 모듈을 오브젝트 매퍼로 생성하고, 이를 @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(customObjectMapper()); return converter; } 처럼 빈으로 생성하여 사용하고있다. (..
-
jpa entity 기본 생성자(Default Constructor) 필요할때개발/Spring 2020. 3. 10. 10:43
jpa로 검색해오는 소스에서 기본 생성자 관련 에러가 발생했다. 검색과 고민 끝애 해당 객체의 이름만 딴 기본생성자를 넣었고, 문제 없이 조회가 가능해졌다 @Entity public class Student{ protected String name; protected int age; public Student(Graduate graduate) this.name = graduate.getName(); this.age = graduate.getAge(); } 와같이 student를 저장할때 졸업생으로 받았다면 학생으로 생성후 저장하려고 생성자를 만들어 뒀는데 이로인한 기본 생성자 에러가 발생한 것이다. JPA는 조회시 default Constructor로 객체를 생성한 뒤 Reflection을 이용해 값을 ..