[회고] 코드숨 스프링 14기 2주차

gwk·2023년 1월 24일
0

코드숨 스프링

목록 보기
2/3

설 연휴 중인데 마침 토비님의 스프링 부트 인강과 jQuery를 만드신 John Reisig의 GraphQL eBook의 독서삼매경에 빠져 회고가 늦어진 점 양해를 부탁드립니다.

2주 차 회고

요번 주 과제는 지난주에 작성한 CRUD API를 스프링 부트로 리팩토링하고 SPA 프런트와 연동까지 확인하는 것이다. 소스 코드는 2 주차 과제에 있다. 강의 노트의 링크들을 통해 스프링 공식 문서들과 친해질 수 있었는데 이중 REST 서비스 구현 가이드를 조만간 다시 봐서 정말 RESTful하게 구현한 API의 스펙을 복습해야겠다.

과제 - Spring Web으로 Todo REST API 만들기

스프링 MVC를 사용하여 controller와 annotation 기반 핸들러 메핑을 구현했다. 지난주에는 평범한 코드로 런타임에 필요한 빈들을 조립하였는데 스프링의 자바 컨피그를 사용하여 의존성 주입을 하였다. 추가로 SPA 기반 프런트와 연동하기 위해서 TasksController에 @CrossOrigin 어노테이션을 달아 CORS 요청을 허용하도록 하였다.

코드 리뷰

3가지 지적 사항과 이에 대해서 더 읽어 볼 수 있는 참고 자료를 추천해 주셨다.

배운 점

  1. 마틴 파울러에 의하면 리포지토리는 data mapper 위에 (더 추상화되어 있고 client에 더 가까운) 레이어로 쿼리 생성 로직이 집적되어 있다.

    클라이언트가 원하는 query에 대한 스펙을 담은 Criteria 객체를 리포지토리에게 전달해서 이를 수행하는 역할을 한다. 리포지토리는 데이터 소스에 저장된 오브젝트들의 캡슐화된 개념으로 영속성 레이어를 OOP 적인 관점으로 클라이언트에게 제공한다. 추가로 data mapper에 대해 알아보았다. 우선 데이터에 접근하는 패턴으로 active record 패턴과 data mapper 패턴이 있다. Data mapper는 오브젝트와 데이터베이스 사이로 데이터를 운반하는 역할을 해서 오브젝트와 관계형 데이터베이스의 패러다임 불일치를 해결해준다.

  2. 스프링에서 DI를 하는 방법 세 가지를 알게 되었다. 또한 마침 Get Your Hands Dirty on Clean Architecture 책을 갖고 있는데 이제 읽을 준비가 된 것 같다.

  3. 클린 아키텍처를 동심원으로 도식화한 그림을 여기저기에서 많이 봤었는데 이 기회에 Uncle Bob의 원조 블로그를 읽어 보았다. 사실 Port-Adapter로 비즈니스 로직을 감싸는 아키텍처에 대한 강의를 최근에 들었는데 아직 소화해내지는 못했지만, Uncle Bob은 그런 클린 아키텍처들의 공통적인 구성과 dependency inversion을 사용한 동작에 대해 말하고 있다. 레이어드 아키텍처를 사용하는 요번 과제에서 중요한 점은 데이터가 외부 web에서 경계선을 넘나들 때는 DTO를 사용하여 도메인 객체에 의존하지 않게 하자라는 점이다. 특히 간단한 CRUD 작업이기에 굳이 service layer를 구현하지 않았는데 그런 의미에서 controller가 domain에 대한 의존성 갖지 않는 것을 잘 된 구조라고 생각된다.

백로그

CORS 요청을 모든 오리진(*) 에 대해 허용하도록 했는데 이는 보안에 안 좋다고 생각하는데 도메인, 환경 (DEV, STG, PRD)에 따라 설정이 변경되도록 하는 방법을 알아보면 좋겠다는 생각이 든다.

그 외

아마 다음 주부터 본격적인 TDD로 진행할 것 같은데 기대된다.

profile
백엔드 개발자

0개의 댓글