728x90
반응형

Spring 16

[Spring] 관습적인 추상화

문제 인식 대부분 프로젝트를 할 때 Service를 인터페이스로 만들고 ServiceImpl을 구현체 클래스로 만들게 됩니다. 이렇게 인터페이스와 클래스로 분리하는 이유는 구현체를 독립적으로 확장할 수 있으며, 구현체 클래스를 변경하거나 확장해도 클라이언트의 코드에 영향을 주지 않기 때문입니다. 또한 위와 같은 추상화 방식을 사용하여 구현하므로써 객체지향의 다섯가지 원칙 중 하나인 OCP원칙을 잘 지키는 설계 방식이라고 할 수 있습니다. [Spring] 객체 지향 설계의 다섯 가지 기본 원칙 - SOLID SOLID 다섯 가지 설계 원칙 단일 책임 원칙(SRP: Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 한다. 책임 영역이 확실해지고, 한 클래스의 변경이..

Spring 2022.08.09

[Spring] 객체 지향 설계의 다섯 가지 기본 원칙 - SOLID

SOLID 다섯 가지 설계 원칙 단일 책임 원칙(SRP: Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 한다. 책임 영역이 확실해지고, 한 클래스의 변경이 다른 클래스의 영향을 미치지 않습니다. 그리고 책임을 적절하게 분배함으로써 코드의 가독성이 향상되고 유지보수가 용이하다는 장점이 있습니다. 개방-폐쇄 원칙(OCP: Open Close Principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 소프트웨어 구성요소인 컴포넌트, 클래스, 모듈, 함수는 확장에는 열려있고, 변경에는 닫혀있어야 합니다. 이것은 변경을 위한 비용을 줄이고, 확장을 위한 비용은 극대화 해야한다는 의미입니다. 즉 요구사항이 변경되거나 추가사항이 발생하더라도 ..

Spring 2022.07.15

[Spring] @ComponentScan @Autowired 의존관계 자동 주입

@ComponentScan @Component 애노테이션이 붙은 클래스를 자동으로 스프링 빈으로 등록합니다. 해당 애노테이션이 붙어있는 클래스부터 하위로 탐색하면서 @ComponentScan의 대상을 찾습니다 그래서 @ComponentScan은 프로젝트가 실행되는 최상단에 두는 것이 좋습니다. 스프링에서는 애플리케이션이 실행되는 {프로젝트이름}Application클래스 @SpringBootApplication을 확인해보겠습니다. @SpringBootApplication 내부에 @ComponentScan이 있는 것을 확인 할 수 있습니다. 애플리케이션이 실행되면서 모든 @ComponentScan의 대상을 찾아서 빈으로 등록하고 @Autowired를 찾아 의존관계도 자동으로 주입해줍니다. @SpringBoo..

Spring 2022.07.12

[Spring] @Configuration과 Singleton By CGLIB

궁금증 MemberService 1번 / TodoService 1번 / MemberRepository 3번 호출 된다고 생각했습니다. 결론적으로 MemberRepository가 3번 호출 되어 싱글톤이 깨질 수도 있다고 생각했습니다. @Configuration public class AppConfig { //차례대로 클래스를 빈에 등록하여 싱글톤을 보장한다고 가정하겠습니다. @Bean //1. MemberService 호출 public MemberService memberService() { //2. MemberRepository 호출 return new MemberServiceImpl(memberRepository()); } @Bean 3. TodoService 호출 public TodoService ..

Spring 2022.07.11

[Spring] Singleton 사용 시 필드 변수 사용 주의❗

개요 싱글톤 방식은 객체 인스턴스를 하나만 생성하여 그 인스턴스를 공유하기 때문에 클라이언트 들이 하나의 인스턴스에 접근을 합니다. 그런데 이때 인스턴스에 있는 필드 변수를 사용하게 되면 문제가 발생할 수 있습니다. 해결방법 싱글톤 방식은 무상태(stateless)로 설계 해야합니다. 1. 클라이언트에게 의존적인 필드가 있으면 안됩니다. 2. 클라이언트가 변경할 수 있는 필드가 있으면 안됩니다. 3. 가급적 필드에 대해 읽기만 가능해야 합니다. 4. 필드 대신 지역변수, 파라미터, ThreadLocal을 사용해야 합니다. 문제점에 대한 예시 필드를 사용하고 클라이언트가 직접 필드의 값을 변경하는 경우 //게임에서 점수를 측정하는 서비스 public class ScoreCheckService { priva..

Spring 2022.07.11

[Spring] AppConfig을 통한 관심사 분리와 리팩터링

1. AppConfig를 통해서 구체 클래스를 선택합니다. 애플리케이션이 어떻게 동작할지에 대해 전체적인 구성을 책임집니다. public class AppConfig { //멤버에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입 public MemberService memberService() { //MemberService 인스턴스를 생성하고 MySQL을 이용한 MemberRepository 객체의 의존성을 주입합니다. //다른 DB를 사용하고 싶다면 Repository 를 새로 생성해서 변경 가능합니다. return new MemberServiceImpl(new MySqlMemberRepository()); } //투두에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입 public To..

Spring 2022.07.11
728x90
반응형