분류 전체보기(81)
-
어떤 상황이 주어질때의 테스트코드는 어떻게 작성하는게 좋을까?
RequiredArgsConstructor란? 생성자 주입 final 혹은 @NotNull이 붙은 필드를 기반으로 생성자를 자동으로 만들어줌 한번 의존성을 주입받은 객체는 프로그램이 끝날때까지 변하지 않음(불변성) JUnit5 단위테스트를 위한 테스트프레임워크 AssertJ 테스트코드 작성을 원활하게 돕는 테스트라이브러리 메서드 체이닝 지원(.이용해서 계속 작성하는 것) //assertEquals - JUnit에 있는 메소드 assertEquals(americano.getName(), "아메리카노"); //assertThat - AssertJ에 있는 메소드 assertThat(americano.getName()).isEqualTo("아메리카노"); AssertJ에서 제공하는 예외를 위한 메소드 - ass..
2024.01.12 -
싱글톤 패턴이 객체 지향에 위반이 된다는데? 왜?
싱글톤 패턴은 객체의 인스턴스를 한개만 생성되게 하는 패턴으로, 메모리,데이터 공유 측면에서 이점이 있다. 하지만 그렇다고 해서 무조건 좋은 것이 아니다. 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생하기 때문 ! 결론 : 싱글톤 패턴은 안티패턴으로 불릴 만큼 단독으로 사용한다면 객체 지향에 위반되는 사례가 많다. 스프링 컨테이너 같은 프레임워크의 도움을 받으면 싱글톤 패턴의 문제점들을 보완하면서 장점의 혜택을 누릴 수 있다. 실제로 스프링 빈은 컨테이너의 도움을 받아 싱글톤 스콥으로 관리되고 있다. 프레임워크 도움없이 싱글톤 패턴을 적용하고 싶다면, trade-off를 잘 고려하여 사용하는 것이 좋다고 한다. 기초 구현 방식 public class Set..
2024.01.12 -
DTO변환 위치 : Controller일까? Service일까?
결론 : 정답이 없다. PostRequest는 toEntity()를 통해 PostRequest(DTO) → Entity로 변환이 가능하다. @Getter @Builder @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PostRequest { private String title; private String content; private String writer; public Post toEntity() { return Post.builder() .title(title) .content(content) .writer(writer) .build();..
2024.01.12 -
DTO 왜 사용해? Entity와 DTO를 왜 분리해?
요약 : DTO(Data Transfer Object)를 사용하는 이유는 크게 두가지로 요약할 수 있다. 1. 필요한 데이터만을 View에 전달하기 위해 2. View와 Domain간의 결합도를 낮추기 위해 Entity와 DTO를 분리하는 이유는 관심사의 분리 및 역할 분리를 위해서이다. 1. DTO를 사용하는 이유 필요한 데이터만을 View에 전달하기 위해 public class User { public Long id; public String name; public String email; public String password; //외부에 노출되서는 안 될 정보 public DetailInformation detailInformation; //외부에 노출되서는 안 될 정보 //비즈니스 로직, ge..
2024.01.12 -
EnumMap이 HashMap보다 성능이 좋은 이유
요약 : 별도로 Hash값을 계산 및 해싱 충돌작업에 대비하는 과정이 필요한 HashMap과 다르게, EnumMap은 Enum의 ‘선언 순서’를 인덱스로 활용하므로, 모든 CRUD과정이 O(1)의 시간을 확보한다. 따라서, Map을 사용하는데 Key가 Enum이라면, EnumMap을 고려하자! EnumMap의 Put() VS HashMap의 Put() EnumMap public V put(K key, V value) { typeCheck(key); int index = key.ordinal(); Object oldValue = vals[index]; vals[index] = maskNull(value); if (oldValue == null) size++; return unmaskNull(oldValue..
2024.01.12 -
Enum 캐싱방법(정적 팩토리 메소드 내용 일 부 발췌)
mathCount에 따른 RANK 를 얻어오고 싶다면 public enum Rank { RANK1(5), RANK2(4), RANK3(3), RANK4(2), RANK5(1), FAIL(0); private final int matchCount; Rank(final int matchCount) { this.matchCount = matchCount; } public static Rank getRankByMatchCount(final int matchCount) { return Arrays.stream(values()) .filter(rank -> rank.matchCount == matchCount) .findFirst() .orElse(FAIL); } } Enum 종류가 N개 있다고 했을때, 매번 O(..
2024.01.12