일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 우아한테크코스
- 우테코
- 레벨2
- AOP
- 프로그래머스
- 우아한세미나
- 의존성
- 트랜잭션
- 스프링부트
- 서블릿
- Docker
- JPA
- Spring Batch
- 백준
- yml
- 코드리뷰
- REDIS
- Level2
- 세션
- 스프링 부트
- 자바
- HTTP
- JUnit5
- 프리코스
- MSA
- 미션
- AWS
- mock
- CircuitBreaker
- Paging
- Today
- Total
목록우아한테크코스 4기/코드리뷰 (8)
늘
1. RestDocs vs swagger 스웨거와는 다르게 프로덕션 코드에 어노테이션을 붙이지 않아서 좋다! 스웨거를 사용하면 뭔가 프로덕션 코드에서 테스트를 위한 코드가 짜여진 느낌?이 든다. 레퍼런스가 많다! - 여러 레퍼런스들을 참고했었는데 자료들이 많아서 쉽게 적용할 수 있다! 운영 코드를 퓨어하게 가져가고 싶다면 레스트 독스를 사용하고 이를 포기하더라도 테스트 코드를 짜고 관리하는 비용을 지불할 경우에는 스웨거를 사용하는 느낌이죠. 2. 잦은 api요청의 영향 API 요청 하나도 내부 서버에서 무거운 로직을 실행하거나 DB를 오래 조회하는 쿼리를 날린다면 성능에 무리가 될 수 있어요. 또한 사용자도 기다리는 시간이 늘어나서 좋지 않은 경험을 하겠죠. 물론 요청의 개수도 성능에 영향을 미쳐요. D..
데코레이터 패턴 위와 같이 요금을 측정하는데, 나이와 거리에 따라 요금을 측정한다고 하자. 이때 나이와 거리의 조합에 따라서 요금이 결정된다고 생각했고 데코레이터 패턴을 적용해봤다. public interface Fare { double calculateExtraFare(); } 요금이 계산되는 메서드를 추가해준다. BaseFare public class BaseFare implements Fare{ private final int extraFare; public BaseFare(final int extraFare) { this.extraFare = extraFare; } @Override public double calculateExtraFare() { return extraFare + 1250; } ..
1. Transactional(readOnly = true)효과 1.성능상에 이점 readOnly일 경우 트랜잭션 ID를 부여하지 않아 조금의 성능 향상이 있다. 2.안전성 읽기가 아닌 수정하는 동작이 발생하면 TransientDataAccessResourceException 예외를 발생하여 변경을 막아줄 수 있습니다. 그런데 디비에 따라 다르고 Mysql은 위처럼 발생하지만 h2 인메모리 디비에서는 예외가 발생하지 않는다고 한다. 3. 가독성 readOnly가 붙은 메서드는 모두 조회 메서드라는 것을 한 눈에 파악할수 있다는게 장점이다. 예를 들어 프로그램이 커지면 수많은 메서드들이 존재할텐데 그중에서 조회 로직을 수정해야한다면, readOnly가 달린 메서드들만 빠르게 찾아 수정할수 있다는 장점이 있..
1. 의존성 주입 방법 setter를 통한 주입 생성자를 통합 주입 필드를 통한 주입 스프링 공식 문서에서도 생성자를 통한 주입을 추천한다고 한다. 생성자를 통한 장점으로는 아래와 같다. setter를 통한 주입과 달리 필드에 final을 선언해줄 수 있고 불변으로 만들 수 있다는 장점이 있다. 결합도를 낮춰 테스트 코드 작성에 용이해지는 장점이 있고 null을 주입하지 않는 한 NPE가 발생하지 않도록 보장해준다. 순환 참조가 발생하면 애플리케이션 실행 시 미리 알려주기 때문에 예방할 수 있다. 왜냐하면 생성자 주입 방식은 객체가 생성되고 필요한 빈을 빈팩토리에서 생성해서 생성자를 찾아 주입하기 때문이다. 반면에 다른 2가지 방법들은 빈이 먼저 생성된 이후에 객체가 생성되고 주입이 되기 때문에 빈을 생..
Level 1의 마지막 미션으로는 체스 미션을 진행했다. 1단계에서는 콘솔 창에서 명령어를 입력해서 체스 게임을 할 수 있도록 구현했다. 2단계에서는 1단계에서 작성했던 도메인을 기반으로 자바 spark로 jdbc를 이용해 db와 연동되도록 구현했다. 1. 상황에 적절한 예외를 던지자. 이펙티브 자바에 의하면 IllegalArgumentException은 허용하지 않는 인수가 들어오는 경우 IllegalStateException은 객체가 메서드를 수행하기에 적절하지 않은 상태인 경우 UnsupportedOpertionException 은 호출한 메서드를 지원하지 않을 때 사용한다. 위 코드는 한 번 override된 메서드이므로 UnsupportedOperationException보다는 IllegalSt..
1. 자료구조를 사용하자 여러 값들을 담을 때 생각없이 매번 List를 쓰는 버릇을 고쳐야겠다. 적절한 자료구조를 사용하면 코드가 많이 줄여지고 깔끔해진다. 2. 정적 팩토리 매서드 네이밍 정적 팩토리 메서드 명명 규칙 from : 매개변수 하나를 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드 ex) Date date = Date.from(instant); of : 매개변수 여러개를 받아서 적합한 타입의 인스턴스를 반환하는 집계 메서드 ex) Set cards = EnumSet.of(JACK, QUEEN, KING); valueOf : from과 of의 더 자세한 버전 ex) BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); instance o..
리뷰를 폭탄으로 맞았다 🤣🤣 오히려 좋다.. 배울게 너무 많아서 😬😬 이번 2주 차 미션을 진행하면서 새롭게 배운 것들이 많다. 1. 멀티 스레드 환경에서 상태 공유 바로 찾아보았다. 학교 운영체재 시간에 배운 동시성 이슈라고 생각했다. final로 완전한 불변이 안 만들어져서 아예 내부 상태를 갖지 않도록 하는 게 좋은 것 같다! 당연한 거지만 자주 까먹는 것 같다.🤣 이번에는 기억해 두자!! 2. 방어적 복사 핵심은 객체 내부의 값을 외부로부터 보호하는 것이라는 것을 유념하자. 생성자의 인자로 객체를 받았을 때 외부에서 넘겨줬던 객체를 변경해도 내부의 객체는 변하지 않아야 한다. 따라서 방어적 복사가 적절하다. getter를 통해 객체를 리턴할 때 이 상황에선 방어적 복사를 통해 복사본을 반환해도 좋..
서론 우아한테크코스를 진행하면서 강의도 도움이 되고 좋았지만 코드 리뷰 또한 몰랐던 내용을 알게 되고, 바로 접목시켜볼 수 있어서 좋았다. 코드 리뷰를 받으면서 배운 점이 많기 때문에 블로그에 글을 작성하면서 정리하기 좋다고 생각되어 우테코를 진행하면서 받은 코드 리뷰들을 정리할 생각이다. 자동차 구현 프리코스때 진행했던 내용과 같지만 페어프로그래밍을 하면서 진행하다 보니 어렵게 느껴졌다. 처음으로 페어프로그래밍을 하면서 (+ TDD) 어색했지만 나의 첫 페어이자 성격좋은 조시덕분에 큰 갈등 없이 무난하게 처리했다. 랜덤 매서드 테스트 항상 궁금했던 랜덤 매서드 테스트! 방법은 크게 2가지로 나뉠 수 있다. 1. 랜덤한 값을 매개변수로 받도록 구현(의존 관계를 상위로 옮김으로써 응집도가 낮아진다.) 2...