인프런 워밍업 클럽 4기 BE - 3주차 발자국

강의 수강

학습 요약

  • Layered Architecture
    컨트롤러, 서비스, 리포지토리 등 계층 간 책임을 명확히 나누는 구조

     

  • Hexagonal Architecture
    애플리케이션의 핵심 도메인을 중심에 두고, 외부 의존성(입출력, DB 등)을 포트와 어댑터로 분리해 유연성과 테스트 용이성을 높인 구조

     

  • 패러다임 불일치
    객체지향 프로그래밍과 관계형 데이터베이스의 개념 차이에서 발생하는 불일치로 객체의 참조와 DB의 외래 키 간의 차이를 적절히 매핑해야 한다.

  • Spring Data JPA
    기본적인 CRUD 쿼리를 인터페이스 정의만으로 제공하며 복잡한 쿼리는 직접 구현하거나 QueryDSL 등을 활용할 수 있다.

  • QueryDSL
    자바 코드 기반으로 JPQL을 작성할 수 있게 해주는 라이브러리로 타입 안정성과 동적 쿼리 작성에 유리하다.

     

  • @Transactional(readOnly = true)
    읽기 전용 트랜잭션 설정으로, 변경 감지를 비활성화해 성능을 최적화할 수 있다.

  • Optimistic Lock / Pessimistic Lock
    낙관적 락은 충돌이 없을 것이라 가정하고 버전 번호로 변경을 감지하고, 비관적 락은 먼저 락을 걸어 동시 수정을 방지한다.

  • CQRS
    명령(Command)과 조회(Query)의 책임을 분리하는 아키텍처 패턴으로 복잡한 읽기/쓰기 로직을 분리해 성능과 유지보수성을 높일 수 있다.

  • @RestControllerAdvice / @ExceptionHandler
    공통 예외 처리를 위한 방법으로 커스텀 예외를 만들어 처리할 수도 있다.

  • Bean Validation
    @NotBlank, @NotNull 등의 어노테이션을 통해 요청값에 대한 유효성 검사를 명시적으로 정의할 수 있다.

  • Mockito / @MockBean
    테스트 시 외부 의존성을 가짜 객체로 대체해 원하는 동작을 검증하거나 테스트 범위를 좁히는 데 사용된다.

     

 

학습 회고

그동안 스프링과 테스트 코드에 관련해 파편적으로만 알고 있던 지식들을 조금 더 체계적으로 정리할 수 있었다. 완전히 처음 접해보는 것이 아닌 개념들이라도 제대로 공부하지 않은 채 그냥 가져다 쓰기만 했던 어노테이션이나 설정의 의미에 대해 생각해보는 계기가 되었다. 시간을 내어 수강하는 것이 쉽지만은 않지만 어떻게든 흐름을 따라가다보면 결국 얻는 것이 있을거라 믿는다.

 

미션

해결 과정

어디부터 시작할지 고민하다가 BoardIndexConverter, CellSnapshot, GameBoard처럼 눈에 띄는 핵심 클래스를 골라 간단한 메서드부터 테스트 코드를 하나씩 작성해보았다. 정상 동작을 확인하는 것부터 시작해 예외 상황까지 케이스를 넓혀가면서 어떤 흐름으로 접근해야 하는지 조금은 감을 잡을 수 있었다. 내부 구현에 너무 의존하지 않고 각 메서드가 맡은 역할과 책임에 맞게 동작하는지를 중심으로 테스트 코드를 작성하려 의식하며 미션을 수행해 보았다.

 

미션 회고

전체 코드에서 어떤 부분을 골라 먼저 작성할 지 생각하는 것부터가 쉽지 않았지만 작은 단위부터 차근차근 확인해 나가면서 테스트 작성 흐름에 약간씩 익숙해질 수 있었던 것 같다. 가독성 있는 테스트 네이밍이나 @DisplayName을 정하는 부분에서 생각보다 많은 고민이 필요해 역시 네이밍이 가장 힘든 부분이라는 걸 다시 한 번 느끼는 시간이었다.

댓글을 작성해보세요.

채널톡 아이콘