분류 전체보기

    스프링 핵심 원리 - 객체지향 원리 적용 정리

    ※ 본 포스팅은 21.10.13에 게시된 글을 이전한 것 입니다. SRP 단일 책임 원칙 단일 책임의 원칙을 지키기 위해 관심사 분리 구현 객체를 생성하고 연결하는 책임은 AppConfig 담당 클라이언트 객체는 실행하는 책임만 담당 DIP 의존관계 역전 원칙 "추상화에 의존해야지, 구체화에 의존하면 안된다."를 따르기 위해 의존성 주입을 사용함 private final MemberRepository memberRepository = new MemoryMemberRepository(); MemoryMemberRepository() 구체화에 의존했다. 하지만 클라이언트는 추상화만 의존해서는 아무것도 실행할 수 없어 AppConfig가 객체 인스턴스를 클라이언트 코드 대신 생성해 클라이언트 코드에 의존관계를..

    [HongEat] 리팩토링 - Enum/toJson(@JsonValue)

    @JsonValue Enum 변수를 Json으로 변환하였을 때 enum의 value(=viewName) 값이 아닌 name이 출력되는 현상이 나타났다. @JsonValue는 전체 인스턴스를 직렬화할 때 사용하는 단일 메서드를 나타낸다. 예를 들어, enum에서 getViewName 메서드에 @JsonValue를 넣어주어 이름을 통해 직렬화하게 한다. public enum Category { RESTAURANT("음식점"), CAFE("카페"), BAKERY("베이커리"), PUB("주점"), BAR("바"), ETC("기타"); private String viewName; @JsonValue public String getViewName() { return viewName; } ... } Dto에 get..

    [HongEat] 리팩토링 - Enum/toEntity(@JsonCreator, @EnumValid)

    @JsonCreater 가게의 카테고리를 Enum을 사용하여 표현해 주었다. @Getter @AllArgsConstructor public enum Category { RESTAURANT("음식점"), CAFE("카페"), BAKERY("베이커리"), PUB("주점"), BAR("바"), ETC("기타"); private String viewName; } 모든 가게의 정보가 이미 데이터베이스에 들어있거나 enum값(CAFE)을 이용하여 가게를 추가하는 게 아니라 요청 시 viewName을 사용하기 위해선 enum값을 맵핑해줘야 한다. @Getter @NoArgsConstructor public class PostStoreDto { ... @ApiModelProperty(value = "가게 종류", ex..

    [HongEat] 리팩토링 - 변경사항

    데이터베이스 변경 PostgreSQL → MySQL으로 변경했다. PostgreSQL의 대표적인 장점은 다음과 같다. 복잡한 쿼리에 탁월 NoSQL 및 다양한 형식(JSON, hstore, XML 등) 지원 다중 버전 동시성 제어 해당 프로젝트에서는 이러한 장점을 하나도 써먹지 못하고 있었다. 복잡한 쿼리가 아닌 JPA로 해결했고, 다른 형식을 저장하지도 않으며, 동시성 제어를 고민할 필요가 없었던 것이다. 단순히 '써보고 싶다'를 넘어 해당 기술을 쓰는 이유가 있어야 한다고 생각해서 바꾸게 되었다. 설치와 관리가 비교적 쉽고, 빠르고, 안정적이며 간단한 데이터베이스인 MySQL으로 변경하게 되었다. 상세정보: MySQL vs PostgresSQL Entity 수정 1. 필요 없는 어노테이션 제거 //빌..

    [HongEat] 리팩토링, 어떻게 진행했는가

    리팩토링 과정을 간략하게 여기에 적어보고 자세한 사항은 추후 포스팅에서 다루겠다. 변경사항 데이터베이스 변경 서비스 Entity 구성 변경 Dto 분할, toDto 로직 생성 Enum 관련 로직 변경 toEntity 로직, validate 어노테이션 및 에러 처리 toJson Enum value 전달