WEB 158

김영한 (ORM 표준 JPA 프로그래밍 3) 영속성 관리 - 내부 동작방식

요청이 올떄마다 EntityManager 를 생성해서 dbconnection 을 사용한다. 영속성 컨텍스트 = 엔티티를 영구 저장하는 환경, 논리적인 개념 EntityManager 를 통해 영속성 컨텍스트에 접근이 가능하다. 엔티티의 생명주기 비영속(new/transient) = 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속(managed) = 영속성 컨텍스트에 관리되는 상태 준영속(detached) = 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제(removed) = 삭제된 상태 장점 1차 캐시 굳이 database까지 안가고 1차캐시에 존재하면 바로 조회하여 네트워크 리소스를 아낄수 있다는 장점이 있다. 만약 없다면 1차캐시에 저장한 후에 반환을 하게 된다. 하지만 애플리케이션 전체에서 공유..

WEB/JPA 2021.02.25

김영한 (ORM 표준 JPA 프로그래밍 2) JPA 시작하기

JPA를 쓰러면 기본적인 설정 하는 persistence.xml 파일을 resource/META-INF 폴더 안에 만들어서 넣어주어야한다. 현재는 연습용으로 h2 를 쓴다. javax. 다른 jpa 구현체를 써도 그대로 유지되지만 hibernate. 시작하는것은 구현체마다 다르게 다른것을 적어주어야 한다. hibernate.show_sql = db 에 나가는 쿼리를 눈으로 확인하겠다 라는 옵션이다. 데이터베이스 방언 JPA는 특정 데이터베이스에 종속적이지 않다. 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름 JPA 구동 방식 객체와 테이블을 생성하고 매핑하기 H2 에 member table을 생성해주고 그에 해당하는 JPA가 관리하는 객체를 생성해준다. package hellojpa; ..

WEB/JPA 2021.02.25

김영한 (ORM 표준 JPA 프로그래밍 1)

JPA가 왜 쓰고 싶은가? SQL 중심적인 개발의 문제점 = 객체답게 모델링 할 수록 매핑작업만 늘어난다. 객체에 필드추가하면 SQL에도 다 추가해야함 -> SQL에 의존적일 수 밖에 없다. 중간에 빼먹으면 큰일난다. 객체를 db에 넣기 위해 SQL Mapping을 개발자가 다 직접 해줘야한다. 객체와 RDB의 차이가 4가지 정도 존재 상속, 연관관계 , 데이터 타입, 데이터 식별 방법 상속 != 슈퍼타입 서브타입 테이블 관계 앨범에 데이터를 저장하고자 할떄 의 순서는 다음과 같다. 1. 객체 분해 -> 2. Insert into item.. , 3. insert into album 앨범에 데이터를 조회하고자 할때의 순서는 다음과 같다. 1.item 과 album을 join해서 불러온후에 -> 2.각각의..

WEB/JPA 2021.02.24

김영한 (스프링 핵심원리 9) 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

빈 스코프란? 스프링 빈은 기본적으로 singleton scope로 생성 되기 때문이다. scope는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 싱글톤 = 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입 = 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지않는 매우 짧은 범위의 스코프이다. request = 웹요청이 들어오고 나갈때까지 유지되는 스코프 이다. session = 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. application = 웹의 서블릿 컨텍스 와 같은 범위로 유지되는 스코프이다. 프로토타입 스코프 싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반..

WEB/Spring 2021.02.15

김영한 (스프링 핵심원리 8) 빈 생명주기 콜백 시작

빈 생명 주기 콜백 시작 데이터베이스 커넥션 풀이나 , 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. package hello.core; public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); connect(); call("초기화 연결 메세지"); } public void setUrl(String url) { this.url = url; } //서비스를 시작시 호출 public void connect() { System.ou..

WEB/Spring 2021.02.14

김영한 (스프링 핵심 원리 7) 의존관계 자동 주입

다양한 의존관계 주입 방법 스프링 빈을 등록을 하는 단계와 의존관계를 주입하는 단계가 따로 되어있다. 생성자 주입 생성자 호출시점에 딱 1번만 호출되는것이 보장된다. 불변,필수 의존관계에 사용한다. 좋은 코딩 습관은 항상 제약이 있는 것이 좋다. private final 은 값이 무조건 있어야 된다는 뜻이다. 언어적으로 잡은것이다. 안주면 컴파일 에러를 동반한다. 수정자 주입(setter 주입) 관례로 field 값을 조정할때 set을 많이 사용한다. 선택, 변경 가능성이 있는 의존관계에 사용 필드주입 코드가 간결해서 많은 개발자들을 유혹하지만 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점 DI 프레임워크가 없으면 아무것도 못함 사용하지말자 @Configuration 같은 곳에서만 특별한 ..

WEB/Spring 2021.02.14

김영한 (스프링 핵심원리 6) 컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기 스프링은 설정 정보가 없어도 자동으로 스프링 빈으로 등록하는 컴포넌트 스캔이라는 기능을 제공한다. package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configur..

WEB/Spring 2021.02.13

김영한 (스프링 핵심원리 5) 싱글톤 컨테이너

웹 애플리케이션과 싱글톤 현제의 Appconfig.class 의 형식이다. 클라이언트가 서비스를 요구할때마다 새로운 객체를 return 해주는 방식이다. package hello.core.singleton; import hello.core.AppConfig; import hello.core.member.MemberService; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class SingletonTest { @Test @DisplayName("스프링 없는 순수한 DI 컨테이너") void pureContainer() { App..

WEB/Spring 2021.02.12

김영한 (스프링 핵심원리 4) 스프링 컨테이너와 스프링 빈

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext는 인터페이스 이고 스프링 컨테이너이다. AnnotationConfigApplcationContext 는 구현체이다. @Bean(name="meberService") 이런식으로 이름을 부여할 수 있지만 절대로 중복이 되면 안된다. 현재까지는 스프링 컨테이너를 생성하고, 설정(구성) 정보를 참고해서 스프링 빈도 등록하고, 의존관계도 설정했다. 이제 Bean 들이 잘 등록이 되었는지 확인을 해보자. package hello.core.beanfind; import hello.core.AppConfig; im..

WEB/Spring 2021.02.12

김영한 (스프링 핵심원리 3) 스프링의 핵심원리이해2 - 객체 지향원리 적용

이미 역할과 구현을 분리해서 설계되었기 때문에 쉽게 정률 discounting을 구현 해주고 적용 시킬 수 있다. package hello.core.discount; import hello.core.member.Grade; import hello.core.member.Member; public class RateDiscountPolicy implements DiscountPolicy { private int discountPrecent = 10; @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return price * discountPrecent / 100; } else { ret..

WEB/Spring 2021.02.10