전체 글
-
Spring 기본 16 - @Configuration과 바이트코드 조작의 마법카테고리 없음 2023. 11. 13. 12:41
@Configuration과 바이트코드 조작의 마법 스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 즉 자바 코드에 따르면 3번 호출외어야 하는 것이 맞다. 그래서 스프링은 클래스 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 @Configuration을 적용한 AppConfig에 있다. @Test void configurationDeep(){ ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); AppConfig bean = ac.getBean(AppConfig.class); System.out.prin..
-
Spring 기본 15 - @Configuration과 싱글FrameWork/Spring&Spring-boot 2023. 11. 13. 10:16
다음 AppConfig코드르 살펴보자 @Configurable public class AppConfig { //@Bean memberService() -> new MemoryMemberRepository() //@Bean orderService() -> new MemoryMemberRepository() //new MemoryMemberRepository()가 두번 호출 되었는데 //그러면 싱글톤이 깨진거 아닐까? @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService(){ return new OrderServiceImp..
-
Spring 기본 15 - 싱글톤 방식의 주의점FrameWork/Spring&Spring-boot 2023. 11. 13. 09:25
싱글톤 방식의 주의점 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나마 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. ⭐무상태(stateless)로 설계해야 한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 해야 한다. 필드 대신에 자에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal등을 사용해야 한다. 스프링 빈 필드에 공유 값을 설정하면 정말 ⛔큰 장애가 발생할 수 있다. 상태를 유지할 경우 발생하는 문제점 예 클라이언트 의도 주문한다음에 price에 값을 저장..
-
Spring 기본 14 - 싱글톤 컨테이너FrameWork/Spring&Spring-boot 2023. 11. 12. 17:30
싱클톤 컨테이너 웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 할 수 있다. 웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 객체 인스턴스가 해당 프로젝트의 JVM에 하나만 있어야 하는 패턴을 의미한다. 앞서 게시물에 작성한 코드를 기반으로 위 그림과 같이 고객이 요청을 3번을 하면 3개의 memberService 객체가 만들어진다. 즉 요청이 올때 마다 객체 인스턴스가 만들어 지고 있는 것이다. package com.hello.core.singleton; import com.hello.core.AppConfig; import com.hello.core...
-
도메인 주도 개발5 - Entity와 Value2Web 개발/도메인 주도 개발 2023. 11. 12. 16:06
Entity와 Value2 엔티티 식별자와 벨류 타입 엔티티 식별자의 실제 데이터는 String과 같은 문자열로 구성된 경우가 많다. 신용카드의 번호도 16개의 숫자로 구성된 문자열이며 많은 온라인 서비스에서 회원을 구분할 대 사용하는 이메일 주소도 문자열이다. 식별자에 밸류타입 사용 public class Order{ //OrderNo 타입 자체로 id가 주문번호임을 알 수 있다. private OrderNo id; ... public OrderNo getId(){ return id; } } Money가 단순한 숫자가 아닌 도메인의 '돈'을 의미하는 것처럼 이런 식별자는 단순한 문자열이 아니라 도메인에서 측별한 의미를 지니는 경우가 많이 때문에 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 ..
-
도메인 주도 개발4 - Entity와 Value1FrameWork/Spring&Spring-boot 2023. 11. 12. 15:12
Entity와 Value1 도출한 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분할 수 있다. 게시글요구사항 분석 과정에서 만든 모델은[그림 1.6]과 같은데 이 그림에는 엔티티도 존재하고 밸류도 존재한다. 엔티티와 밸류를 제대로 구분해야 도메인을 올바르게 설계하고 구현할 수 있기 때문에 이 둘의 차이를 명확하게 이해하는 것은 도메인을 구현하는데 있어 중요하다. 엔티티 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다. 식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다. 예를 들어 주문 도메인에서 각 주문은 주문번호를 가지고 있는데 이 주문번호는 각 주문마다 서로 다르다. 따라서 주문번호가 주문의 식별자가 된다. 앞서 주문 도메인 모델에서 주문에 해당하는 클래스가 Or..
-
Spring 기본 13 - 스프링 빈 설정 메타 정보 - BeanDefinitionFrameWork/Spring&Spring-boot 2023. 11. 10. 17:44
스프링 빈 설정 메타 정보 - BeanDefinition 스프링은 어떻게 이런 다양한 설정 형식을 지원 하는 것일까? 그 중심에는 BeanDefinition이라는 추상화가 있다. 쉽게 이야기해서 *역할과 구현을 개념적으로 나눈 것* 이다. XML을 읽어서 BeanDefinition을 만들면 된다. 자바 코드를 읽어서 BeanDefinition을 만들면 된다. 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면된다. BeanDefinition을 빈 설정 메타정보라 한다. @Bean, 당 각각 하나씩 메타 정보가 생성된다. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다. 즉 스프링 컨테이너 자체이 BeanDefinition에만 의존한다. 코드 레..
-
Spring 기본 12 - BeanFactory와 ApplicationContextFrameWork/Spring&Spring-boot 2023. 11. 10. 15:43
BeanFactory와 ApplicationContext BeanFactory와 ApplicationContext에 대해서 알아 보자 *BeanFactory* 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당한다. getBean() 을 제공한다. 지금까지 게시문에서 스프링 빈을 조회한 것에 대부분의 기능은 BeanFactory가 제고하는 기능이다. *ApplicationContext* BeanFactory기능을 모두 상속 받아 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 그 둘의 차이는 뭘까? 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능을 물론이고, 이외에도 수많은 부가적인 기능이 필요하다. *ApplicationCon..