본문 바로가기

회고록 모음/코드숨-스프링 과정 회고록

[회고록] 코드숨 Spring - 5주차 코드리뷰 (Validation, DTO, Dozer Mapper)

[ 5주차 회고록 📚]

 

에러와의 싸움

 


📌 커리큘럼 


📌 코드리뷰 with 깃허브

github.com/CodeSoom/spring-week5-assignment-1/pull/11

 

[Spring 5주차 과제] 고양이 장난감가게 유효성 추가하기, 회원 관리 만들기 by developerOlive · Pull Requ

📍 1. 고양이 장난감가게 유효성 검사 추가하기 고양이 장난감은 이름, 메이커 그리고 가격은 필수 입력 항목입니다. 이 중에서 하나라도 빠트린 경우에는 처리를 거부하고 웹에게 에러 응답을

github.com


1. 한 것

- 코드숨 스프링 5회 강의 2개 듣기

 

- 과제 1 : 고양이 장난감 목록 얻기, 상세 조회하기, 등록하기, 수정하기, 삭제하기 -> 유효성 검사 코드 작성

 

- 과제 2 : 회원 생성, 수정, 삭제하기 REST API 만들기 + 테스트 코드 작성 + API 테스트 통과 

 

- 과제 3 : 테스트 커버리지 100% 달성하기

 

- 과제 4 : e2e 테스트 통과하기 

 

- 과제 풀이 영상 보기 feat.아샬님

 

테스트 커버리지

 

API 테스트


2. 배운 것

 

처음으로 스프링 1기 슬랙 채널에 질문을 해보았다.

테스트 커버리지 100%를 달성해야 하는데, 나의 발목을 붙잡는 것이 있었기 때문이다. 

 

toString()을 테스트하는 코드를 작성하라고 외쳐대는 붉은색 막대기들이 내 마음의 평화를 깨뜨리고 있었음....

 

 

@Builder 롬복을 사용하면서 자동으로 toString()이 구현되는 것 같은데...

마땅히 테스트할 내용도 없어서 어떻게 처리하면 좋을까 이리저리 구글링을 해봤다.

 

아래와 같이 lombok.config 파일을 만들어서 처리하라는 외국인의 글을 보고 시도해 봤으나 실패....

 

 

 

 

내 질문에 아무도 답글을 달아주지 않으면 조금 슬프겠지....ㅎㅎ 하면서 슬랙 채널을 확인했는데

다행히 동기 1분이 답글을 달아주셨다.

 

 

결론적으로 @lombok.Generated 어노테이션을 붙여서 해결을 했다!

(감사합니다. 동기님,,ㅎㅎ)

 


테스트 커버리지 100%와의 싸움을 끝내고

다음 관문인 e2e 테스트를 돌렸다.

 

하지만 아래 이미지와 같이 network error가 나면서 몇몇 테스트를 통과하지 못하는 상황이 나를 맞이했다.

네트워크 에러는 왜 생긴 것일까?

 

네트워크 에러에 대해 이리저리 검색해도 딱히 원인을 모르겠는 상황....

나를 도와줄 F12 버튼을 살포시 눌러보았다.

 

정열적인 빨간색 글자가 등장하며 친절하게 "CORS error"라고 표시해주고 있었다. 

 

 

📍CORS 란?

  • Cross Origin Resource Sharing - 교차 출처 리소스 공유 
  • Cross-origin resource sharing (CORS) is a browser mechanism which enables controlled access to resources located outside of a given domain.
  • 교차 출처 리소스 공유는, origin에서 실행 중인 웹 애플리케이션이 다른 origin의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 메커니즘이다.
  • 서로 다른 도메인에서 리소스를 공유하는 방식

 

📍Origin이란?

Web content's origin is defined by the scheme (protocol)host (domain), and port of the URL used to access it. 

Two objects have the same origin only when the scheme, host, and port all match.

 

  • 웹 콘텐츠의 출처(origin)는 다음 3가지 조합을 말한다. 1)URI 스키마(http, https)  2) 호스트(도메인) 이름  3) 포트 번호 
  • 스키마, 호스트 및 포트가 모두 일치하는 경우에만 두 개체의 출처가 동일하다는 의미이다.

 

📍@CrossOrigin이란?

예를 들어 웹 애플리케이션은 8080 포트에서 실행 중이고,

javaScript를 사용하여 9000 포트에서 RESTful API를 사용하려고 하면 

웹 브라우저 CORS 보안 문제에 직면하게 된다.

 

이때 문제를 처리하려면 다음 두 가지 사항이 만족되어야 한다.

1) RESTful 웹 서비스는 Cross-Origin 리소스 공유를 지원해야 한다.

2) RESTful 웹 서비스 애플리케이션은 8080 포트에서 API에 액세스 할 수 있어야 한다.

 

 

 

결국 CORS error는 위와 같이 컨트롤러에 @CrossOrigin 이라는 어노테이션을 사용해 문제를 해결했다.

@CrossOrigin 어노테이션을 붙여주면 기본적으로 '모든 도메인, 모든 요청 방식'에 대해 허용한다는 뜻이다.

 

 


📍Dozer란?

  • Dozer는 객체와 객체끼리 매핑을 할 때 쉽게 할 수 있도록 도와주는 라이브러리다.
  • Dozer는 한 객체에서 다른 객체로 데이터를 재귀적으로 복사하는 Java Bean to Java Bean 매퍼이다.
  • 간단한 속성 매핑부터 복잡한 타입 매핑까지 가능한 라이브러리로, DTO를 쉽게 만들 수 있도록 도와준다.

 

📍Dozer Mapper 사용방법은?

출처  https://dozermapper.github.io/gitbook/documentation/usage.html

 

 

| 코드 설명 

mapper.map(sourceObject, DestinationObject.class);

--> Dozer Mapper을 사용하여 sourceBean에서 DestinationBean으로 데이터를 매핑한다는 의미.

 

 

📚 5주차 과제에서 Dozer Mapper을 활용하여 구현한 부분

build.gradle에 추가

 

@Bean : 개발자가 직접 제어가 불가능한 외부 라이브러리를 스프링 컨테이너에 Bean으로 등록할 때 사용

 

Dozer Mapper을 활용하여 DTO인 productData를 Product에 매핑시킨다.

 


📍Validation이란?

쉽게 말해 어떤 데이터의 값이 유효한지 확인하는 것을 의미한다.

 

- Spring MVC Validation

The Spring MVC Validation is used to restrict the input provided by the user.

To validate the user's input, the Spring 4 or higher version supports and use Bean Validation API.

It can validate both server-side as well as client-side applications.

 

- Bean Validation API

The Bean Validation API is a Java specification which is used to apply constraints on object model via annotations.

Here, we can validate a length, number, regular expression, etc.

Apart from that, we can also provide custom validations.

 

 

 

📚 5주차 과제에서 Validation을 구현한 부분

 

build.gradle에 추가

 

유효성 검사를 하고 싶은 변수 상단에 제약조건 어노테이션을 선언한다.

 

컨트롤러 - @RequestBody 옆에 @Valid 어노테이션을 추가한다.

 


📍인텔리제이에서 import * (개별 클래스가 아닌 와일드카드로 전체가 import 되는 현상)을 방지하는 방법

 

Preference - Editor - Code style - java - imports 

1) class count to use import with '*' 와 Names  count to use static import wth '*'의 기본값이 5와 3으로 되어있다.

2) 그 값을 999로 수정하면 개별로 import가 된다.

 

 

 


📍인텔리제이에서 파일 저장 시, 파일 마지막 줄에 개행 문자를 자동으로 추가하는 방법

 

Preference - Editor - General - Ensure every saved file ends with a line break

 


3. 느낀 것

 

- 알맹이가 있고 싶었다.

과제를 최선을 다해 했는데, 막상 "그게 뭐고 왜 써요?" 라는 질문을 받는다면

나는 막힘없이 대답할 수 있을까?

분명 나는 그 기능을 썼는데 막상 요약해서 설명을 못한다면 절반만 아는 게 아닐까.

 

주어진 기간 내에 요구사항을 모두 통과하는 과제를 완료하는 게 나에게 가장 우선순위인 건 맞다.

하지만 그와 더불어 관련된 개념 정리와 암기가 동반되어야 하는데, 놓치고 있는 부분이 있었다.

앞으로 남은 기간 동안에는 이 부분을 좀 더 보완해서 공부해야겠다는 생각이 든다.

 

 

 

- 토요일에 이번 주차 강의를 복습 차원에서 한 번 더 봤다.

과제를 끝내고 나서 한 번 더 보니, 처음 들었을 때 나도 모르게 놓쳤던 부분이 조금 더 명확해지는 느낌을 받았다.

망각의 동물인지라 한 번 듣고서는 날아가는 지식이 많다. 

반복 밖에는 답이 없다.

 

- 회고록이 내게 주는 의미는 크다.

많은 정보와 느낌을 담고 싶다.

각 주차마다 느꼈던 깨달음들은 시간이 지나면 희미해지기 때문이다.

 

내가 작성한 이전 회고록을 다시 보는데

'내 기억 속에서 날아간 부분이 꽤 있구나. 이때는 이런 생각을 했었네.'라는 생각을 해본다.

난 내 머리를 잘 믿지 않는다. 내 기록을 믿을 수밖에 없다.

그러니 잘 기록해두자.

 

- 이번 코드 리뷰에서 '트레이드오프'라는 키워드가 나왔다.

프로그래밍을 하다 보면 항상 100% 효율적이라는 답이 없는 경우가 많다. 

트레이드 오프일 때 중요한 것은 '합당하다고 말할 수 있는 이유'라고 생각한다.

 


4. 자기 선언 

 

최애 작가님의 글

 

그래 나를 좀 위로해 보자.

 

바람을 쐴 겸, 세상이 어떻게 변해가고 있나 느낄 겸

얼마 전 오픈한 더 현대 서울에 다녀왔다.

 

사람은 오지게 많았으며,

오랜만에 보는 초록색 풀의 향연이 마음을 트이게 해 줬다.