Spring Boot 예제 2 - 객체 지향 원리 적용 (2)
2021. 7. 12. 00:36
Spring Boot
좋은 객체 지향 설계의 5가지 원칙 적용 SRP 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 클라이언트 객체는 직접 구현 객체를 생성하고, 연결하고, 실행하는 다양한 책임을 가지고 있음 SRP 단일 책임 원칙을 따르면서 관심사를 분리함 구현 객체를 생성하고 연결하는 책임은 AppConfig가 담당 클라이언트 객체는 실행하는 책임만 담당 DIP 의존관계 역전 원칙 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다. 새로운 할인 정책을 개발하고, 적용하려고 하니 클라이언트 코드도 함께 변경해야 했다. 기존 클라이언트 코드( OrderServiceImpl )는 DIP를 지키며 DiscountPolicy 추상화 인터페이스에 의존하는 것 같았지만, FixDiscountPolicy 구체화 구현..
[Java] equals(), hashCode(), == 연산자 정리
2021. 6. 28. 23:06
Java
안녕하세요. 오늘은 자바의 자료형과 == 연산자, equals(), hashCode() 에 대해 정리해보겠습니다. Java Data Type 기본 자료형 자바 컴파일러에 의해 해석되는 자료형 실제 값을 갖는 자료형 자바에서 여러 형태의 타입을 미리 정의하여 제공 참조 자료형 값이 아닌 객체의 주소를 가지고 있는 자료형 == 연산자 피연산자가 primitive type일 때는 값이 같은지 비교하고, reference type일 때는 가리키는 주소가 같은지 검사한다. 아래 그림을 보면 "값이 같은지, 주소가 같은지 검사"한다는 것이 결국 해당 변수의 값을 비교하는 것임을 알 수 있다. equals() public static boolean equals(byte[] value, byte[] other) { i..
Spring Boot 예제 2 - 객체 지향 원리 적용 (1)
2021. 6. 22. 13:24
Spring Boot
새로운 할인 정책 개발 새로운 할인 정책을 확장해보자. 새로운 할인 정책 적용과 문제점 방금 추가한 할인 정책을 어플리케이션에 적용해보자. 할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 변경해야 한다. -> 문제점 발견 문제점 우리는 역할과 구현을 충실하게 분리했다. (O) 다형성 활용, 인터페이스와 구현 객체를 분리했다. (O) OCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했다. -> 그렇게 보이지만 사실은 아니다. DIP: 주문 서비스 클라이언트(OrderServiceImpl)는 DiscountPolicy 인터페이스에 의존하면서 DIP를 지킨 것 같지만 추상(인터페이스)뿐만 아니라 구체(구현) 클래스에도 의존하고 있다. DIP 위반 추상(인터페이스) 의존: Disc..
Spring Boot 예제 1 - 자바 예제 만들기
2021. 6. 21. 00:35
Spring Boot
비즈니스 요구사항과 설계 회원 회원을 가입하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정) 주문과 할인 정책 회원은 상품을 주문할 수 있다. 회원 등급에 따라 할인 정책을 적용할 수 있다. 할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용해달라. (나중에 변경될 수 있다.) 할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했고, 오픈 직전까지 고민을 미루고 싶다. 최악의 경우 할인을 적용하지 않을 수도 있다. (미확정) 요구사항을 보면 회원 데이터, 할인 정책과 같은 부분은 지금 정하기 어렵다. 그렇다고 이러한 정책이 결정될 때 까지 무기한 기다릴 수 ..
DTO, VO, DAO 정리
2021. 6. 14. 23:35
Spring Boot
DTO(Data Transfer Object) 프로세스 간에 데이터를 전달하는 객체 DAO, BO와의 차이점은 DTO에는 저장, 검색, 직렬화 및 역 직렬화를 제외하고 동작이 없다는 것 즉, DTO는 비즈니스 로직을 포함하지 않고 데이터를 전달하기 위한 단순한 객체 VO(Value Object) Immutable 속성의 값을 가진 객체 자바에서 단순히 값을 표현하기 위해 불변 클래스를 만들어 사용한다. DTO와 VO의 차이 참조(Reference)와 가변(Mutable) class Money { private long amount; private Currency curr; public long getAmount() { return amount; } public void setAmount(long amou..
좋은 객체지향 설계의 5가지 원칙 SOLID & Spring
2021. 6. 8. 23:02
Spring Boot
SRP 단일 책임 원칙 Single Responsibility Principle 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것 예) UI 변경, 객체의 생성과 사용을 분리 OCP 개방-폐쇄 원칙 * Open/Closed Principle 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다. 다형성을 활용해보자! 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 지금까지 배운 역할과 구현의 분리를 생각해보자. 문제점 MemberService 클라이언트가 구현 클래스를 직접 선택 구현 객체를 변경하려면..
객체 지향 설계와 Spring boot
2021. 6. 7. 23:31
Spring Boot
Spring 스프링 부트, 스프링 프레임워크 등을 모두 포함한 스프링 생태계 Spring boot 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용 단독으로 실행할 수 있는 스프링 어플리케이션을 쉽게 생성 Tomcat과 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨 손쉬운 빌드 구성을 위한 starter 종속성 제공 스프링과 3th party 외부 라이브러리 자동 구성 -> 외부 라이브러리 버전에 대해서 고민하지 않아도 됨 메트릭, 상태 확인, 외부 구성과 같은 프로덕션 준비 기능 제공 -> 모니터링이 편리 관레에 의한 간결한 설정 Spring의 핵심 개념, 컨셉 이 기술을 왜 만들었는가? 스프링은 자바 언어 기반의 프레임워크 자바 언어의 가장 큰 특징 - 객체 지향 언어..
[Java8] 자바 스트림 Java Stream API
2021. 6. 1. 13:23
Java
Stream이란? A sequence of elements supporting sequential and parallel aggregate operations 순차, 병렬 집계 작업을 지원하는 요소 컬렉션, 배열 등의 저장 요소를 하나씩 참조하여 반복적으로 처리할 수 있도록 해주는 인터페이스 데이터소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들이 정의되어 있습니다. 간단하게 병렬 처리가 가능하여 많은 요소들을 빠르게 처리할 수 있습니다. * 추상화 -> 어떤 데이터든 같은 방식으로 다룰 수 있게 하는 것, 재사용성이 높아짐 자바8 이전에는 컬렉션, 배열 인스턴스의 데이터를 for, if 문을 통해 처리했습니다. 이러한 경우 로직이 복잡해질수록 코드의 가독성이 떨어지게 됩니다. 순회를 위한 f..