
\-> 객체 지향 언어\-> 클라이언트: 대상의 역할만 알면 된다.내부 구조 몰라도 된다.내부 구조 변경되어도 영향을 받지 않는다역할 = 인터페이스구현 = 인터페이스를 구현한 클래스, 구현 객체구현 보다는 인터페이스가 먼저이다. 클라이언트: 요청, 서버: 응답\-> 객

요구사항중 지금 결정하기 어려운 부분이 나오는 경우도 있다! 이런 정책이 결정될 때 까지 개발을 무기한으로 기다릴 수 도 없다. 고로 인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계해야한다! (참고로 HashMap은 동시성 이슈가 발생할 수 있다. 이런

할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야한다우리는 역할과 구현을 충실하게 분리했다. OK다형성도 활용하고, 인터페이스와 구현 객체를 분리했다. OKOCP, DIP 같은 객체지향 설계 원칙을 충실히 준수했다 \- 그렇게 보이지만 사

ApplicationContext를 스프링 컨테이너라고 한다ApplicationContext는 인터페이스다AppConfig를 사용한 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든것이다new AnnotationConfigApplicationConte

등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설정정보도 커지고 누락할 수 도 있다. 고로 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔해서 스
생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입생성자를 통해서 의존 관계 주입생성자 호출시점에 딱 한번만 호출/ 불변, 필수 의존 관계에 사용setter라 부리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존 관계 주입선택, 변경 가능성이 있는

객체의 초기화와 종료 작업객체 생성 -> 의존관계 주입 -> 필요한데이터 사용할 수 있는 준비 완료스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에 소멸

싱글톤: 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프프로토타입: 스프링 컨테이너는 빈의 생성 + 의존관계 주입까지만 관여한다!웹 관련 스코프: request, session(웹 세션 생성, 종료), application(웹의 서블릿 컨텍스트와 같

Java Persistence API자바 진영의 ORM 기술 표준Object-relational mapping(객체 관계 매핑)객체는 객체대로 설계관계형 데이터베이스는 관계형 데이터베이스대로 설계ORM 프레임워크가 중간에서 매핑대중적인 언에는 대부분 ORM 기술이 존재

JPA는특정 데이터베이스에 종속 X각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금식 다르다 \- 가변 문자: MySQL은 VARCHAR, Oracle은 VARHCAR2문자열 자르는 함수: SQL: SUBSTRING, Oracle: SUBSTR페이징: MySQ

ORM영속성 컨텍스트엔티티를 영구 저장하는 환경EntityManager.persist(entity);엔티티 매니저를 통해서 영속성 컨텍스트에 접근비영속: 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속: 영속성 컨텍스트에 관리되는 상태 준영속: 영속성 컨텍스트

@Entity가 붙은 클래스는 JPA가 관리기본 생성자 필수final 클래스, enum, interface, inner 클래스 사용X저장할 필드에 final 사용 Xname: 이름 지정@Table: 엔티티와 매핑할 테이블 지정개발 초기 단계는 create 또는 upda
테이블은 외래 키로 조인을 사용객체는 참조를 사용해서 연관된 객체를 찾는다mappedBy = JPA의 멘탈붕괴 난이도양방향관계 => 서로 다른 단방향 관계외래키 하나로 두 테이블의 연관관계를 관리연관관계의 주인만이 외래 키를 관리(등록, 수정)주인이 아닌쪽은 읽기만 가

일대다 관계는 항상 다(N)쪽에 외래 키가 있다엔티티가 관리하는 외래 키가 다른 테이블에 있다.연관관계 관리를 위해 추가로 UPDATE SQL 실행\- 일대다 단방향보다 다대일 양방향 매핑 사용!!\-> 공식적으로 존재하지 않느낟\-> 다대일 양방향!!주 테이블이나 대

관계형 데이터베이스는 상속 관계가 존재하지 않는다슈퍼타입, 서브타입 관계!@Inheritance(strategy = InheritanceType.XXX) \- JOINED: 조인 전략SINGLE_TABLE: 단일 테이블 전략TABLE_PER_CLASS: 구현 클래스마

em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference(): 데이터베이스 조회를 미루는 가짜 엔티티 객체 조회실제 클래스를 상속 받아서 만들어짐실제 클래스와 겉 모양이 같다사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않

엔티티 타입 \- 데이터가 변해도 식별자로 지속해서 추적값 타입 \- 식별자가 없고 값만 있으므로 변경시 추적 불가임베디드 타입(embedded type)컬렉션 값 타입(collection value type)기본 타입은 항상 값을 복사한다!Integer, Stri

JPA를 사용하면 엔티티 객체를 중심으로 개발테이블이 아닌 엔티티 객체를 대상으로 검색JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어 제공= 자바 코드로 JPQL작성, JPQL 빌더하지만 너무 복잡하고 실용성이 없다자바코드로 JPQL작성, JPQL빌더, 컴

InheritanceType.SINGLE_TABLE: 단일 테이블 전략상속 구조의 모든 엔티티를 하나의 테이블에 매핑합니다.@DiscriminatorColumn 어노테이션을 함께 사용하여 엔티티의 타입을 구분하는 컬럼을 생성합니다. dtype 컬럼을 사용하여 각각의 엔
기술 설명\*\*@Repository : 스프링 빈으로 등록, JPA 예외를 스프링 기반 예외로 예외 변환@PersistenceContext : 엔티티 메니저( EntityManager ) 주입 EntityManager를 빈으로 주입할 때 사용하는 어노테이션입니다.

준영속 엔티티?영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.(여기서는 itemService.saveItem(book) 에서 수정을 시도하는 Book 객체다. Book 객체는 이미 DB에 한번 저장되어서 식별자가 존재한다. 이렇게 임의로 만들어낸 엔티티도 기존