📚 레이어드 아키텍처(Layered Architecture)

- 통합 테스트(Integration Test)
- 여러 모듈이 협력하는 기능을 통합적으로 검증하는 테스트
- 일반적으로 작은 범위의 단위 테스트만으로는 기능 전체의 신뢰성을 보장할 수 없다.
- 풍부한 단위 테스트와 큰 기능 단위를 검증하는 통합 테스트
- 배운 내용을 현재 진행하고 있는 spoteditor 프로젝트에 적용해보았다.
- Persistence Layer의 경우 비즈니스 로직이 침투해선 안 된다.
@SpringBootTest
@ActiveProfiles("test")
@Transactional
class PlaceRepositoryTest {
@Autowired private PlaceRepository placeRepository;
@Autowired private UserRepository userRepository;
@Test
@DisplayName("공간을 조회할 수 있다.")
void 공간을_조회할_수_있다() {
// given
User user = userRepository.save(User.builder()
.email("[email protected]")
.name("아무개")
.build());
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(1);
pageRequest.setSize(20);
pageRequest.setDirection(Sort.Direction.ASC);
Place place1 = Place.builder()
.user(user)
.address(Address.builder()
.address("테스트1")
.roadAddress("테스트1")
.latitude(37.123)
.longitude(128.123)
.sido("테스트1")
.bname("테스트1")
.sigungu("테스트1")
.build())
.description("장소 설명1")
.name("장소 이름1")
.category(TOUR)
.build();
Place place2 = Place.builder()
.user(user)
.address(Address.builder()
.address("테스트2")
.roadAddress("테스트2")
.latitude(37.1234)
.longitude(128.1234)
.sido("테스트2")
.bname("테스트2")
.sigungu("테스트2")
.build())
.description("장소 설명2")
.name("장소 이름2")
.category(CAFE)
.build();
Place place3 = Place.builder()
.user(user)
.address(Address.builder()
.address("테스트3")
.roadAddress("테스트3")
.latitude(37.12345)
.longitude(128.12345)
.sido("테스트3")
.bname("테스트3")
.sigungu("테스트3")
.build())
.description("장소 설명3")
.name("장소 이름3")
.category(RESTAURANT)
.build();
placeRepository.saveAll(List.of(place1, place2, place3));
// when
PageResponse<PlaceResponse> places = placeRepository.findAllPlace(pageRequest);
List<PlaceResponse> content = places.getContent();
// then
assertThat(content).hasSize(3)
.extracting("name", "description", "category")
.containsExactlyInAnyOrder(
tuple("장소 이름1", "장소 설명1", TOUR),
tuple("장소 이름2", "장소 설명2", CAFE),
tuple("장소 이름3", "장소 설명3", RESTAURANT)
);
}
}
- Persistence Layer는 Data Access 역할을 처리한다.
- 따라서 비즈니스 가공 로직이 포함되어서는 안 된다.
- Data에 대한 CRUD에만 집중한 레이어이다.