Backend/Spring
트랜잭션은 작업에서 예외가 발생할 경우 Rollback 처리를, 모두 성공할 경우 Commit 처리하는 실행 단위이다.Spring에서는 트랜잭션과 관련된 기술들을 제공하며, 주로 @Transactional 어노테이션을 통해 쉽게 사용할 수 있다.이번 포스팅에서는 Transacrtional을 Spring의 트랜잭션의 동작 특성과, 트랜잭션 전파라는 키워드를 위주로 살펴보려고 한다. Spring이 제공하는 트랜잭션 기능 1. 트랜잭션 동기화데이터베이스와의 작업이 트랜잭션 컨텍스트 내에서 일관되게 처리될 수 있도록 도와준다. 이는 여러 데이터베이스 작업이 하나의 트랜잭션 안에서 수행되도록 동기화하는 것을 의미한다. 예를 들어, 하나의 서비스 메서드에서 두 개의 다른 데이터베이스 테이블을 업데이트해야 한다고 ..
우리는 흔히 Controller, Service, Repository 등의 계층별 모듈로 구분하여 프로그램을 작성한다.이번 포스팅에서는 Layer 별 테스트 코드를 어떻게 작성하면 좋을지에 대한 전략에 대해서 작성해보려고 한다. 해당 포스팅의 내용은 무조건 계층별로 테스트 코드는 이렇게 작성해야 한다는 것이 아닌, 그저 테스트 코드를 작성하는 수만가지 전략 중 하나라는 것을 엄두하고 구경하면 좋을 것 같다. 기본사항 프로파일 분리application.yml의 프로파일을 Test 전용으로 나누어 독립적인 DB를 사용할 수 있게 하자.테스트 시 실제 환경(DB)에 영향을 주지 않고 데이터베이스를 초기화하거나 필요한 데이터를 주입하여 테스트할 수 있도록 하기 위해서이다.spring: profiles: ..
레이어드 아키텍쳐 (3-tier Layered Architecture) 우리는 흔히 Spring Framework를 이용하여 Controller, Service, Repository 등의 계층별 모듈로 구분하여 프로그램을 작성하였다. 해당 구조를 3-tier Layered 아키텍쳐라고 한다.해당 구조는 각 계층이 서로 독립적으로 동작하고 각 계층의 역할을 명확하게 구분하여 유지보수성과 확장성을 높이는 것을 목표로 한다. 이번 포스팅에서는 프로그램을 작성할 때, 계층별로 집중해야 하는 포인트에 대해서 알아보려고 한다. Presentation Layer 사용자와 애플리케이션 간의 인터페이스 역할을 담당하는 계층이다. 사용자의 요청을 수신하고, 이를 비즈니스 로직으로 전달하며, 결과를 사용자에게 반..
테스트 코드의 필요성 수동 테스트의 문제점 수동으로 테스트 한다는 것은 곧 사람이 직접 테스트를 수행한다는 것이다. 특정한 케이스를 직접 넣어보고, 출력이나 로그 따위를 살펴보거나 디버깅을 해보는 행위, 우리가 늘상 해오던 과정이다. 그러나 사람이란 누구든 실수를 하며, 편협된 시각을 가지고 있다. 이로 인해 커버하지 못하는 영역이 있을 수 있으며, 이는 늦은 피드백, 유지보수의 난이도 상승, 소프트웨어 신뢰성 하락으로 이어진다. 테스트 코드의 필요성 테스트 코드의 정체성은 "빠른 피드백", "자동화", "안정성", "공유"로 압축할 수 있다. 빠른 피드백 : 개발자는 Production Code(실제 코드)와 Test Code 사이의 피드백을 통해 품질을 개선해 나갈 수 있다. 개발자가 코드를 작성하고..
이전 포스팅에서 @SpringBootTest를 사용해서 통합 테스트를 작성하는 방식에 대해서 알아보았다.이번 포스팅에서는 테스트 코드에서의 모듈 의존성 격리의 필요성과, 어떤 경우에 대해 적용되어야 하는지 알아보도록 하겠다. https://sjh9708.tistory.com/195 [Spring Boot] 테스트 코드 : 시작하기 (JUnit)테스트 코드의 필요성 및 실천 방법론 테스트 코드의 필요성과 "좋은 테스트 코드"를 작성하기 위한 방법론에 대해서 작성한 내용이다. 테스트 코드를 "왜" 작성하고 "어떠한 마음가짐"으로 임sjh9708.tistory.com 테스트를 작성할 예시 Service 필자는 아래의 서비스에 대한 테스트 코드를 작성해 보면서 앞으로의 내용을 설명하려고 한다.@Service@..
테스트 코드의 필요성 및 실천 방법론 테스트 코드의 필요성과 "좋은 테스트 코드"를 작성하기 위한 방법론에 대해서 작성한 내용이다. 테스트 코드를 "왜" 작성하고 "어떠한 마음가짐"으로 임할 지에 대해서 서술해두었으니 읽어보면 좋을 것 같다. https://sjh9708.tistory.com/238 [Spring Boot] 좋은 테스트 코드 : 필요성 및 실천 방법론 개요테스트 코드의 필요성 수동 테스트의 문제점 수동으로 테스트 한다는 것은 곧 사람이 직접 테스트를 수행한다는 것이다. 특정한 케이스를 직접 넣어보고, 출력이나 로그 따위를 살펴보거나 디sjh9708.tistory.com JUnit이란? 자바를 위한 단위 테스트 프레임워크이다. 메소드, 클래스 및 패키지에 대한 단위 테스트를 작성하..
JPA를 사용할 때, QueryDSL을 도입하는 가장 큰 이유는 동적 쿼리 작성에 매우 유연하다는 점이다. 이번 포스팅에서는 동적 쿼리를 작성하는 방법에 대해서 알아보도록 하겠다. 사용할 데이터 1. Author : Book = 1 : N Author(저자)는 여러 개의 Book(책)을 가진다. 2. Author : Organization = N : 1 Author(저자)는 한곳의 Organization(조직)에 속한다. 3. Book : Review = 1 : N Book(책)은 여러 개의 Review(리뷰)를 가진다. @Entity @Table(name = "Organization") @Getter @Setter public class Organization { @Id @GeneratedValue(s..
이전 포스팅들에서 JPQL, Spring Data JPA Repository, QueryDSL 등을 통해서 데이터를 조회하는 방법들에 대해서 다루어 보았었다. 이번에는 쿼리 결과로 나온 Entity 혹은 Tuple들을 DTO로 매칭하는 방법을 알아보려고 한다. 기본적인 DTO 변환 방법 : 스트림 API ToOne 관계, ToMany 관계 조회 매핑 ModelMapper 활용 ToOne 관계, ToMany 관계 조회 매핑 프로젝션 프로젝션 사용 방법들 서브쿼리, Case, ToOne 관계, ToMany 관계 조회 매핑 QueryProjection ToOne 관계, ToMany 관계 조회 매핑 사용할 데이터 1. Author : Book = 1 : N Author(저자)는 여러 개의 Book(책)을 가진다..
이전 포스팅에서 기본적인 QueryDSL의 검색 쿼리 문법에 대해서 살펴보았었다. 이번 포스팅에서는 연관된 다른 릴레이션과의 연산을 수행하는 Join과 Subquery 방법에 대해서 알아보도록 하겠다. 아래 포스팅은 QueryDSL의 기본 검색에 대한 문법을 정리해 둔 것이니 참고하면 좋을 것 같다. https://sjh9708.tistory.com/175 [Spring Boot/JPA] QueryDSL 문법(1) : 기본 검색 (선택, 조건, 정렬, 집계, 그룹화) 이전 포스팅에서 QueryDSL 사용을 Repository에서 할 수 있도록 설정하는 방법에 대해서 다루어 보았었다. 이제 실제로 자주 사용되는 SQL문을 QueryDSL을 통해 작성해보도록 하자. JpaRepository는 인터페이 sjh..