-
월간 멘토링 - 1개월차학습로그 2022. 2. 28. 23:07
진행기간
2021년 12월 13일 ~ 2022년 1월 30일 학습로그 ( + 피드백 정리 )
📝 12월 13일 ~ 12월 25일
개인 프로젝트 리팩토링 진행
- 자바 코드 컨벤션 (구글 자바 스타일 가이드) : 자바로 코드를 작성할 때 지켜야 할 기본 규칙
https://dodop-blog.tistory.com/262
- 객체지향 생활 체조 : 객체지향적인 코드를 작성하기 위한 가이드 라인
https://dodop-blog.tistory.com/263
- RestFul API : 자원에 대한 행위를 HTTP method로, 자원을 URI로 표현하는 REST 아키텍처 스타일
https://dodop-blog.tistory.com/272
- Setter의 사용이 금지되는 이유
https://dodop-blog.tistory.com/265
- DTO, VO, Entity 객체 비교
https://dodop-blog.tistory.com/266
- 케이스 스타일 : 프로그래밍을 할 때 사용하는 문자 표기 스타일
https://dodop-blog.tistory.com/274
- 롬복 사용지양 : @RequiredArgsContructor, @Data 등의 롬복 기능 사용을 자제해야 하는 이유에 대해 서 공부하였다.
https://dodop-blog.tistory.com/273
- 예외처리의 오류코드 수정 (Unchecked Exception 에 대해서 오류코드 500(서버의 잘못)처리)
https://dodop-blog.tistory.com/282
- 트랜잭션 : 비지니스 로직에서 쪼개질 수 없는 하나 단위의 작업
https://dodop-blog.tistory.com/270
- StreamAPI
https://dodop-blog.tistory.com/283
- Method Reference
https://dodop-blog.tistory.com/271
- dto에서 엔티티를 의존하도록 (엔티티는 dto 알지 못하도록 구성변경) 하기
public Activity toActivity(){ return new Activity(name, score, description); }
- JPA의 변경감지 사용하기 : update 기능을 구현할 때 findById 를 통해 객체를 찾게 되면 JPA의 변경감지 기능을 사용할 수 있으므로 값 변경후 따로 save 하지 않아도 변경사항이 반영되므로 save메소드 없이 이를 사용하도록 피드백을 받았다.
- Optional을 바로 get()사용하지 말고 없는 경우 예외처리 해주기
- 라이프 사이클(생명주기)이 같지 않은 엔티티는 다르게 분리하기 : 기존 프로젝트는 생명주기가 같지 않은 엔티티(activity와 이미지 파일)를 동시에 create 및 update 처리하고 있었으나 activity 생성및 이미지 저장 기능을 따로 분리하여 controller에서 유효성검증이 이루어질 수 있도록 변경하였다.
- 유효성 검증은 controller에서 진행하기 (bean validation) : 데이터를 service에서 직접 == null을 통해 null 체크 하는 경우가 있었는데 이를 라이프 스타일이 같은 엔티티끼리만 처리가 되도록 수정하면서 유효성검증을 controller에서 진행이 되도록 수정하도록 피드백을 받게 되었다.
- 값을 하드코딩하기 보다는 상수로 나타내기
📝 멘토링 1주차 ( 12월 27일 ~ 01월 02일 )
자동차 경주 미션 완료 및 로또게임 1단계
- 값을 입력받는 로직과 출력하는 로직을 구분하여 구현하기
public class InputView { } public class ResultView { }
- Unmodifiable의 사용 : getter를이용하여 값을 반환할 때 Unmodifiable을 이용하여 값이 변경되는 것을 방지하기
public List<LottoNumber> getLottoNumber() { return Collections.unmodifiableList(lottoNumber); }
- Math함수 에대한 학습 테스트 진행
- 추상화 수준을 맞추고 로직은 메서드 이름을 통해서 의미를 충분히 드러내기
- 돈을 나타내는 단위는 천 단위에 언더바(_)를 붙여서 나타내기
public static final int DEFAULT = 1_000
- static 의 사용 자제
https://dodop-blog.tistory.com/275
- 리팩토링 예제 학습
https://dodop-blog.tistory.com/269
📝 멘토링 2주차 ( 01월 03일 ~ 01월 09일)
로또게임 1단계 피드백 수정 및 2단계 , 3단계 구현
- 예외사항 테스트 시 예외사항 별로 테스트 케이스는 분리하여 작성하기
@ParameterizedTest @DisplayName("개수가 6보다 작은 숫자는 로또를 생성하지 않고 알맞은 예외를 발생시킨다.") void number_size_less_than_six_is_invalid(NumberStrategy invalidNumberStrategy) { } @ParameterizedTest @DisplayName("중복된 숫자는 로또를 생성하지 않고 알맞은 예외를 발생시킨다.") void duplicated_number_is_invalid(NumberStrategy invalidNumberStrategy) { }
- 테스트 결과에 따른 기대값은 로직이 아닌 예상값을 통하여 테스트 진행하기
@ParameterizedTest @MethodSource("lotto") @DisplayName("당첨번호와 일치하는 로또 번호의 갯수와 보너스볼과의 일치 정보를 올바르게 반환한다.") void get_matchCount(List<Lotto> lottos, List<Integer> expected) { //given setUp(); //when List<MatchResult> matchResult = winningLotto.matchResults(lottos); //then for (int i = 0; i < lottos.size(); i++) { assertEquals(matchResult.get(i).getMatchCount(), expected.get(i)); } }
- Pair, Map과 같은 클래스 보다는 포함하는 객체를 생성하여 나타내기
- Commit을 기능단위로 나누어 구현 나타내기
https://dodop-blog.tistory.com/268
https://dodop-blog.tistory.com/267
- 와일드카드를 쓰기보다는 타입체크를 하여 컴파일시에 확인하기
// NOT GOOD public ResponseEntity<?> userActivities(@RequestParam("page") String page, // OK public ResponseEntity<UserAtivitiesResponse> userActivities(@RequestParam("page") String page,
- 메서드의 순서
https://dodop-blog.tistory.com/277
- ParameterizedTest의 활용 : Argument를 이용하여 여러번 테스트가 가능하도록 하는 기능으로 중복되는 여러 상황에 대해서 테스트를 진행하도록 한다.
@ParameterizedTest @CsvSource({"2, test, 1, 2, 1, 2.00", "1, testReview, 3, 2, 1, 1.00","5, testComment, 4, 3, 1, 5.00"}) @DisplayName("주어진 정보에 알맞은 리뷰를 생성한다.") void create_review(Integer rating, String comment, Integer productId, Integer userId, int expectedCount, BigDecimal expected) { //given ReviewRequest request = new ReviewRequest(rating, comment, productId, userId); //when ReviewResponse response = reviewService.create(request); //then assertThat(response.getRating()).isEqualTo(rating); assertThat(response.getComment()).isEqualTo(comment); assertThat(product.getReviews().size()).isEqualTo(expectedCount); assertThat(product.getAverage()).isEqualTo(expected); }
- MockBean을 사용한 단위테스트 진행
https://dodop-blog.tistory.com/285
https://dodop-blog.tistory.com/286
- Optional의 사용
https://dodop-blog.tistory.com/276
📝 멘토링 3주차 ( 01월 10일 ~ 01월 16일)
로또게임 3단계 피드백 수정 jpa 미션 1단계
- 원시타입의 포장 ( Embeddable의 객체를 만들어 사용하기)
public class Review { @Embedded private ReviewInfo reviewInfo; } @Embeddable public class ReviewInfo { }
- 디미터의 원칙 적용하기 : 객체간의 결합도를 줄이기, 한줄에 점을 하나만 찍는다.
- 테스트코드의 중복부분 Fixture 를 만들어 사용하도록 설정
- 엔티티에 Timestamp 추가하기 ( + Auditing)
https://dodop-blog.tistory.com/281
📝 멘토링 4주차 ( 01월 17일 ~ 01월 23일)
jpa 미션 2단계 완료 3단계 완료 sql 학습
- 커밋 나누기 꼭 !
📝 멘토링 5주차 ( 01월 24일 ~ 01월 30일)
인수테스트 미션 1단계 및 피드백 수정
- existsBy를 활용하기
https://dodop-blog.tistory.com/291
- 메서드 이름에 의도를 분명히 나타내기
- 객체 삭체시 응답 코드는 204 (noContent())코드로 보내기
@DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable("id") Long id) { reviewService.delete(id); return ResponseEntity.noContent().build(); }
- 테스트 결과 리스트를 받아 비교할 때는 containsExactly를 활용하여 일치 여부 확인 하기
- 값에대한 유효성을 체크하고 이에 따른 예외 테스트 케이스 작성하기
- Mock과 Fake, Test Double
https://dodop-blog.tistory.com/287
https://dodop-blog.tistory.com/288
🌱 멘토링 1개월차 학습 후기
한달 반 동안 개인 프로젝트 리팩토링과 미션을 진행하면서 지켜야하는 기본규칙( 자바 스타일 가이드, 객체지향 생활체조 등 )과 어떻게 객체지향적으로 코드를 구성하는지에 대한 학습하는 시간을 갖게 되었다. 혼자 프로젝트를 진행할 때에는 기초적인 것조차 모르고 어떻게 해서든 굴러가기만 하는 코드를 작성했었는데 이를 기본규칙에 따라서 리팩토링하고 미션을 통해 학습한 내용을 프로젝트에 추가적으로 적용하면서 다시 한번 학습하게 되었다. 모르고 사용했던 부분( 롬복의 무분별한 사용, static의 사용, setter의 사용금지 등등)에 대해서 피드백을 받으면 블로그 글을 작성하면서 추가적으로 배울 수 있는 시간이었다.
'학습로그' 카테고리의 다른 글
월간 멘토링 - 4개월차 (0) 2022.04.28 월간 멘토링 - 3개월차 (0) 2022.04.28 2개월차 모의면접 (0) 2022.03.20 월간 멘토링 - 2개월차 (0) 2022.02.28 프로젝트 공방 멘토링 (Feat. NextStep) (0) 2022.02.28