본문 바로가기
관리자

Programming-[Backend]

(421)
[스프링 기초] 6. 사용영역과 구성영역 나누기로 SRP, OCP, DIP 원칙 실현하기 1. 변경 코드 적용 : RateCaringPolicy 동물원의 정책이 바뀌어서, FixedCaringPolicy에서 RateCaringPolicy로 변경됬다. 다행히도 다형성을 지켜가면서 인터페이스로 역할을 만들어놨기 때문에, 기존 인터페이스를 상속받는 새로운 클래스를 만들기가 수월하다. RateCaringPolicy CaringPolicy 역할(interface)을 그대로 상속받기 때문에 작성해놓았던 totalExpense 메서드를 그대로 활용할 수 있다. 2. SRP, OCP, DIP 위반 그런데, 바뀐 RateCaringPolicy를 적용하기 위해서 클라이언트와 소통하는 Service 코드를 살펴보면 OCP, DIP 그리고 SRP가 위반되어 있는 것을 알 수 있다. 아래 코드를 보면서 뭐가 잘못된..
[스프링 기초] 5. 예제만들기2 : SRP 원칙 및 객체 주입, 의존에 대한 이해 1. 예제 확장 위 그림과 같이 예제를 확장해보자. Plan(Creature, CaringPrice, Policy) 관리 계획에서는 Plan이라는 객체가 있고, Plan은 생물(creature)의 종류, 생물 종류에 따른 Caring Price, 관리 정책 Policy에 의해 제어된다. Service, 로직을 구현하는 위치 클라이언트로부터 받은 파라미터 값을 검증(validation)하거나, 계산하는 등 input값을 바탕으로 적절한 output을 만들어 내는 곳이다. Creature, 관리 대상인 생물들 생물들은 각기 무게(weight)가 있고, 무게에 비례하게 관리 비용(expense)이 든다고 가정한다. 또한 동물이든 식물이든 멸종위기 종의 기준인 Grade가 있어서, 일반 종은 Normal, 멸종..
[링크] 자바 final 요약 참조1. 링크 요약 -final은 클래스, 메서드, 변수에 붙일 수 있다. -final로 선언하면 해당 객체가 변하더라도 원래 선언 시에 할당되었던 값으로만 객체를 참조한다. -final이 붙은 클래스는 상속 불가 -final이 붙은 메서드는 오버라이드 불가 -final이 붙은 변수는 재할당 불가 참조 1. 개발왕 도던님의 블로그 https://makemethink.tistory.com/184
[TIL] [패턴] 회원 활성화/비활성화, 수정 비즈니스 로직 구현 1. 구현 대상 회원 또는 활성화/비활성화 및 수정 비즈니스 로직이 필요한 경우. 예를 들어 아래와 같은 엔티티가 있다고 가정한다. 2. 구현 방식 2-1. Controller 수정을 목적으로 하므로, @PutMapping 처리를 해준다. 프론트 쪽에서 "v1/member" 주소로 MemberChangePo를 Http의 Body로 던져주고, Service에서 changeMemberInfo 메소드를 실행한다. 2-2. Service 여기가 패턴의 핵심이다. DB에서 어떤 객체의 Id값이 0일수 없으므로, id가 0일 때는 새로운 객체를 생성하도록 한다. -> 210604 수정 : id == 0 으로 하되, null 일때의 방어 로직이 있어야 한다. 생성된 엔티티의 필드값들을 Po로 입력받은 값들로 정의하고..
[스프링 기초] 4. 예제 만들기 1. creature 패키지 1-1. Grade Enum NORMAL과 ENDANGERED 속성을 만든다. 1-2. Creature 클래스 Creature 클래스를 만든다. 이 클래스는 필드로 id, name, grade를 갖는다. 생성자와 getter, setter를 만들어준다. 2. Repository 생물들에 대한 정보를 저장할 수 있는 Repository를 만든다. 원래는 Database에 Table을 만들어 정보를 저장하는데, 해당 강의에서는 다루지 않는 범위이므로 여기서는 Map 객체로 메모리 저장소를 만든다. 인터페이스 정의 interface 형태로 creatureRepository를 만든다. 생물들의 정보를 저장할 수 있는 save, 조회할 수 있는 findById 메소드를 만든다. 위에서..
[스프링 기초] 3. 프로젝트의 구조 및 생성 1. 예시 프로젝트 구조 김영한님의 강의를 그대로 따라하는 것보단, 조금 내용을 바꿔가며 학습해야 생각을 하면서 학습할 수 있을 것 같다. 강의에서는 회원들의 정보를 다루는 도메인을 예시로 든다. 이와 유사하게 동물원을 만든다고 생각하고, 동물원에 포함된 생물들(Creature)을 관리하는 도메인을 만들어보자. 구조는 아래 그림과 같이 강의 내용과 동일하다. Service와 Repository는 기본적으로 Interface 형태로 만든다. 여기서 핵심은, 객체를 interface로 만들어서 다형성을 활용하여 코드의 변경이 용이하게 한다는 점이다. CreatureRepository를 상속받는 구현체가 CreatureRepositoryAnimals가 되든, CreatureRepositoryPlants가 되든..
[TIL] BeanUtils.copyProperties, 엔티티 객체 복사하기 1. 용도 특정 객체의 필드값들을 복사한 새로운 엔티티를 반환해준다. 이런 기능을 사용하지 않으면 같은 객체를 만들기 위해서 모든 필드값을 일일이 set해줘야하는데, 이런 불편함을 해결해준다. 2. 사용법 파라미터로 기존 엔티티(originEntity), 복사할 엔티티(targetEntity), 복사안할 필드값("id")를 차례대로 작성해준다. 추가 참조1에 따르면, 기존 엔티티(source)에는 Getter가 필요하고, 복사할 엔티티(target)에는 Setter가 있어야한다고 한다. 해당 메서드의 스펙이 그렇다. 참조 참조1) https://zzang9ha.tistory.com/304
[TIL] ENUM 값 정의하고 불러오기 1. 정의 클래스를 정의하듯이, 'public enum 이름' 으로 정의한다. 상단부에 ENUM의 이름을 대문자로 적고, 속성값으로 필드값들을 정의한다. 생성자와 Getter를 작성한다. 2. 사용 ENUM으로 정의한 모든 value들을 return 하기 위해서 Arrays.stream(ENUM 이름.values()).map() 메서드를 활용한다.