본문 바로가기

분류 전체보기

(114)
[JPA] 엔티티 설계 엔티티 설계시 주의점 엔티티에는 가급적 Setter를 사용하지 말자 Setter가 모두 열려있다. 변경 포인트가 너무 많아서, 유지보수가 어렵다. 나중에 리펙토링으로 Setter 제거 모든 연관관계는 지연로딩으로 설정! 즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다. 실무에서 모든 연관관계는 지연로딩( LAZY )으로 설정해야 한다.@ManyToOne(fetch = FetchType.EAGER) 로 작성하게되면 100개가 order에서 주문되었을떄 100+1 의 문제가 발생하게된다. @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id ..
[JPA] Hibernate DB 연동 ddl-auto: create를 사용하면 서버를 띄움과 동시에 db를 생성해준다 . spring: #띄어쓰기 없음 datasource: #띄어쓰기 2칸 datasource: url: jdbc:h2:tcp://localhost/~/jpashop #4칸 username: sa password: driver-class-name: org.h2.Driver jpa: #띄어쓰기 2칸 hibernate: #띄어쓰기 4칸 ddl-auto: create #띄어쓰기 6칸 properties: #띄어쓰기 4칸 hibernate: #띄어쓰기 6칸 show_sql: true #띄어쓰기 8칸 format_sql: true #띄어쓰기 8칸 logging.level: #띄어쓰기 없음 org.hibernate.SQL: debug #띄..
[What I Learn] 서버사이드렌더링 ServerSide Rendering(SSR) : 서버에서 페이지를 그려 Client로 보낸 후 화면에 표시하는 기법을 말한다. 이와 반대되는 개념으로는 클라이언트 렌더링이 있다. 즉 브라우저에 보여주는 데이터를 서버측(backend)에서 가공하여 보내주는것을 의미한다. 서버사이드 렌더링을 쓰는 이유 검색엔진 최적화, 빠른 페이지 렌더링이 가장큰 이유다. 검색엔진 최적화 : 구글, 네이버 등과 같은 검색 플랫폼에서 사용자가 검색시 빠른 결과를 보여줄 수 있도록 하는 용도이다. 빈 HTML페이지를 다운받아 브라우저에서 그리는 클라이언트 사이드 렌더링과 다르게 서버에서 미리 그려 브라우저로 보내주기 때문에 페이지를 그리는 시간을 단축할 수 있습니다. 사용자 입장에서는 화면에 유의미한 정보가 표시되는 시간이 ..
[Spring] Prototye N Scope 프로토타입 빈의 특징 스프링 컨테이너에 요청할때 마다 새로 생성된다. 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입 그리고 초기화까지만 관여한다. 종료메서드가 호출되지 않는다 프로토타입 빈은 프로토타입 빈을 조회한 클라이언트가 관리해야한다. 종료 메서드에 대한 호출도 클라이언트가 직접해야한다. 싱글톤 vs 프로토타입 빈 싱글톤 스프링 컨테이너에서 하나의 객체를 생성한뒤 이 객체를 공유하는 방식 싱글톤 빈은 생성시점에만 의존관계를 주입받는다 프로토타입 요청시마다 새로운 객체 생성됨 | 여러개의 같은 프로토타입 빈을 주입 받으면 주입받는 시점에 각각 새로운 프로토타입 빈이 생성된다. 예를들어 client1, client2가 | 각각 같은 의존관께를 주입받으면 각각 다른 인스턴스의 프로토타입 빈을 주..
[Spring] Bean 생명주기 빈생명주기 빈 생명주기 콜백 시장 데이터베이스 커넥션풀, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애프릴케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. 간단한게 외부네트워크에 밀 ㅣ연결하는 객체를 하나 생성성한다고 가정했을때 실제로 네트워크를 연결하는것은 아니고 단순히 문자만 출력하도록 했다 이 networkCient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고 애플리케이션이 종료되면 discount() 를 호출해서 연결을 끊어야 한다. package hello.core.lifecycle; public class NetworkClient { private String url; public..
[Spring] Bean 생명주기 빈생명주기 빈 생명주기 콜백 시장 데이터베이스 커넥션풀, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애프릴케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다. 간단한게 외부네트워크에 밀 ㅣ연결하는 객체를 하나 생성성한다고 가정했을때 실제로 네트워크를 연결하는것은 아니고 단순히 문자만 출력하도록 했다 이 networkCient 는 애플리케이션 시작 시점에 connect() 를 호출해서 연결을 맺어두어야 하고 애플리케이션이 종료되면 discount() 를 호출해서 연결을 끊어야 한다. package hello.core.lifecycle; public class NetworkClient { private String url; public..
[Spring] Bean 가공 조회할 빈이 2개 이상일때 해결방법 @Autowired 필드 명 매칭 @Quilifier -> @Qulifier 끼리 매칭 -> 빈 이름 매칭 @Primary 사용 @Autowired 팰드명 매칭 타입 매칭을 시도하고 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다. 필드명이 rateDiscountPolicy 이므로 정상 주입된다. 필드명 매칭은 먼저 타입 매칭을 시도하고 그 결과에 여러 빈이 있을 때 추가로 동작하는 기능이다. @Qulifier 사용 추가 구분자를 붙여주는 방법이다. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다. package hello.core.discount; import hello.core.member.Grade; impor..
[Spring] 생성자 주입을 선택하는 이유 생성자 주입을 선택하기 수정자 주입과 필드 주입을 많이 사용했엇지만 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 "불변" 때문이다. 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다. 수정자 주입을 사용하면 setXXX 메서드를 public으로 열어두어야 한다. 누군가 실수로 변경할 수 도 있고 변경하면 안되는 메서드를 열어두는 것은 좋은 설계 방법이 아니다. 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되느 ㄴ일이 없다. 따라서 불변하게 설계할 수 있다. "누락" 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에 다음과 같이 수정자..