
1\. main과 test가 구분되어있다.\\= test code가 중요하다.2\. tomcat이 내장되어 있어서 실행하면 바로 포트 8080으로 서버가 실행된다.3\. 스프링부트 스타터 : 스프링부트 + 스프링 코어 + 로깅4\. 테스트 라이브러리mockitoasse

데이터: 회원ID, 이름기능: 회원 등록, 조회컨트롤러 웹 MVC의 컨트롤러 역할서비스 핵심 비즈니스 로직 후현리포지토리 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리도메인 비즈니스 도메인 객체 ex)회원, 주문 쿠폰 등등 주로 DB에 저장하고

클래스에서 Ctrl + shift + T 하면 바로 테스트 케이스 틀이 만들어진다.중복\_회원\_예외 //when 방법 2

컴포턴트 스캔과 자동 의존관계 설정자바코드로 직접 스프링 빈 등록하기@Controller@Service@Repository스프링은 스프링 컨테이너에 스프링 빈을 등록할때, 기본으로 싱글톤으로 등록한다.따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이

home.htmlcreateMemberForm.htmlHomeController.javaMemberController.java@GetMapping은 조회할때, @PostMapping 값을 받아올때 사용한다.

※회원 이름이 등록이 안되는 문제 발생 해결해야함memberList.htmlMemberController.java

※회원 이름이 등록이 안되는 문제 해결createMemberForm.htmlname ="name" 이 누락됬었다.h2 설치 후 실행h2/bin/h2w.bat 혹은 h2.bat으로 실행한번 연결해서 test.mv 파일 생성JDBC URL을 jdbc:h2:tcp://loc

※어제 작성했던 JdbcMemberRepository.java를 SpringConfig로 AutoWired했으나 오류 발생SpringConfig.java해결방안1\. h2 DB 버전을 최신버전 -> 1.4.200 으로 수정 => 해결X\*\*2\. h2 URL ip를

개방-폐쇄 원칙 (OCP, Open-Closed Principle)확장에는 열려있고, 수정, 변경에는 닫혀있다.@SpringBootTest: 스프링 컨테이너와 테스트를 함께 실행한다.@Transactional: 테스트를 위해 join을 하고 findOne도 한 후 tr

build.gradleapplication.propertiesJpaMemberRepository.javaMember.javaMemberService.javaSpringDataMemberRepository.javaSpring.ConfigAOP가 필요한 상황모든 메소드의

ejb -> 하이버네이트 -> JPA필수스프링 프레임 워크스프링 부트선택스프링 데이터스프링 세션스프링 시큐리티스프링 rest docs스프링 배치스프링 클라우드스프링 부트스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용단독으로 실행할 수 있는 스프링 애

start.spring.ioproject: Gradle ProjectSpring Boot: 2.7.2Language: JavaPackaging: jarJava: 17Setting - gradle - build and run using = InteliJ IDEA회원회원을

주문과 할인 정책회원은 상품을 주문할 수 있다.회원 등급에 따라 할인 정책을 적용할 수 있다.할인 정책은 모든 VIP는 1000원을 할인해주는 고정 금액 할인을 적용(나중에 변경 될 수 있다.)할인 정책은 변경 가능성이 높다. 회사의 기본 할인 정책을 아직 정하지 못했

애자일 소프트웨어 개발 선언 https://agilemanifesto.org/iso/ko/manifesto.htmlRateDiscountPolicy.javaRateDiscountPolicyTest.javaOrderServiceImpl.java할인 정책을 변경하

MemberServiceImpl.javaAppConfig.javaAppConfig는 애플리케이션의 실제 동작에 필요한 "구현 객체를 생성"한다.AppConfig는 생성한 객체 인스턴스의 참조(레퍼런스)를 "생성자를 통해서 주입(연결)"해준다.객체의 생성과 연결은 App

AppConfig.java이제 할인 정책을 변경해도, 애플리케이션 구성 역할을 담당하는 AppConfig만 변경하면된다.클라이언트 코드인 OrderServiceImpl을 포함해서 "사용영역"의 어떤 코드도 변경할 필요가 없다.OCP와 DIP를 모두 만족한다"한 클래스는

ApplicationContext를 스프링 컨테이너라고 한다.ApplicationContext는 인터페이스이다.스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.직전에 AppConfig를 사용했던 방식이 애노테이션

스프링 빈 조회 - 동일한 타입이 둘 이상

스프링 빈을 조회할일은 거의 없지만 기본적이기 때문에 알아둬야 함.BeanFactory스프링 컨테이너의 최상위 인터페이스다.스프링 빈을 관리하고 조회하는 역할을 담당한다.getBean() 제공ApplicationContextBeanFactory 기능을 모두 상속받아서

스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다.대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다.웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.스프링이 없는 순수 DI 컨테이너

스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다."싱글톤 컨테이너"스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤

//@Bean memberService -> new MemoryMemberrepository() 를 호출한다. 객체가 생성된다.//@Bean orderService -> new OrderServiceImpl()을 호출 -> new MemoryMemberRepositor

지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean을 통해서 직접 등록할 스프링 빈을 나열했다.예제에서는 몇개가 안되었지만, 이렇게 등록해야할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다.그래서 스프링

탐색할 패키지의 시작 위치 지정만약 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication을 이 프로젝트 시작 루트 위치에 두는 것

의존관계 주입은 크게 4가지 방법이 있다.생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입지금까지 진행했던 방법이 생성자 주입이다.특징생성자 호출시점에 딱 1번만 호출되는 것이 보장된다."불변, 필수" 의존관계에 사용생성자가 딱 1개만 있으면 @Aut

주입할 스프링 빈이 없어도 동작해야 할 때가 있다.그런데 Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.자동 주입 대상을 옵션으로 처리하는 방법은 다음과 같다.@Autowired(requir

과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 프레임 워크 대부분이 생성자 주입을 권장한다."불변"대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료

막상 개발을 해보면, 대부분이 다 불변이고, 그래서 다음과 같이 생성자에 final 키워드를 사용하게 된다.그런데 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 하고..필드 주입처럼 좀 편리하게 사용하는 방법은 없을까?다음 기본 코드를 최적화 해보자

@Autowired는 타입으로 조회한다.스프링 빈 조회에서 학습했듯이 타입으로 조회하면 빈이 2개 이상일때 문제가 발생한다.DiscountPolicy 하위 타입인 FixDicountPolicy, RateDiscountPolicy 둘다 스프링 빈으로 선언해보면LogNoU

조회 대상 빈이 2개 이상일 때 해결방법@Autowired 필드 명@Quilifier@Primary@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다.Autowired 매칭1\. 타입 매칭2\. 타

@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다. 다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있다.MainDiscountPolicyRateDIscountPolicy OrderServiceImpl애노테

의도적으로 정말 해당 타입의 스프링 빈이 다 필요한 경우도 있다.예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자. 스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다.LogDIsco

데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 지점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다.스프링을 통해 이러한 초기화 작업과 종료 작업을 진행할 수 있다.

Log초기화, 소멸 인터페이스 단점이 인터페이스는 스프링 전용 인터페이스다. 해당 코드가 스프링 전용 인터페이스에 의존한다.초기화, 소멸 메서드의 이름을 변경할 수 없다.내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.인터페이스를 사용하는 초기화, 종료 방

스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위

프로토타입 빈 직접 요청 싱글톤 빈에서 프로토타입 빈 요청

싱글톤 빈과 프로토타입 빈을 함께 사용할 때, 어떻게 하면 사용할 때 마다 항상 새로운 프로토타입 빈을 생성할 수 있을까?가장 간단한 방법은 싱글톤 빈이 프로토타입을 사용할 때 마다 스프링 컨테이너에 새로 요청하는 것이다.그런데 이렇게 스프링의 애플리케이션 컨텍스트 전

특징웹 스코프는 웹 환경에서만 동작한다.웹 스코프는 프로토타입과 다르게 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다.종류request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가