스프링

우리는 db를 이용하기 위해서 connection을 얻어야한다. EntityManagerFactory라는 곳에서 요청이 올때마다 EntitiyManager를 생성하고, 이 엔티티매니저는 커넥션 풀 안에 있는 커넥션을 사용하여 db에 접근할 수 있게된다. 영속성 컨텍스트란 엔티티를 영구 저장하는 환경 ! EntityManager.persist(entity); 로 영속성 컨텍스트에 엔티티를 영속화 시킨다. 엔티티매니저를 통해서 논리적인 개념인 영속성 컨텍스트에 접근할 수 있다. 스프링 프레임워크와 같은 환경에서 엔티티 매니저와 영속성 컨텍스트가 N:1의 관계이다. 엔티티매니저 == 영속성 컨텍스트라고 봐도 무방하다. 엔티티 생명주기 비영속 (new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 ..
· 스프링
의문 데브코스에서 백엔드 프로젝트의 테스트 코드를 작성하던 중, 어느곳에서는 given()을 쓰고, 어느곳에서는 when()을 썼다. 둘 다 하는 기능은 똑같은데 왜 다른 이름을 쓰는걸까? 하는 의문점이 생겼다. when() 은 org.mockito.Mockito 를 import 하고, given()은 org.mockito.BDDMockito를 import한다. Mockito란? 우리는 객체간의 의존성에 대한 설계만 잘해주면 스프링에서는 DI를 지원해주어 알아서 객체들간의 의존성 관리를 해준다. 하지만 테스트를 하게될 때, 의존 관계를 맺고 있는 다른 객체가 있는 경우 다른 객체에 의해서 테스트 결과각 영향을 받을 수 있다는 문제가 있다. 이런 경우 우리는 테스트 대상을 고립되게 만들어야 하는데 그것을 ..
멤버를 조회할 때는 멤버만 가져오고 팀은 프록시로 가져왔다. 이제 m.getTeam().getName() 으로 팀에 있는 뭔가에 접근을 할 때, 쿼리가 나감! team 프록시 객체가 초기화 되면서 db에서 이 값을 가져와서 채운다. eager로 변경을 하게 되면 팀을 조인해서 select 쿼리가 나간다. 실무에서는 즉시로딩 쓰면 안된다. jpql의 경우 member를 select한 후 member를 가져왔더니, team이 즉시로딩으로 되어있네? 즉시로딩인 경우 값이 다 들어가 있어야 한다. -> member 쿼리가 나가고, member의 개수가 10개라면 10개만큼 eager로 가져오기 위해서 쿼리가 별도로 나간다 예를 들면 select * from Member; select * from Team whe..
EntityManagerFactory는 사용자의 요청이 있을때마다 EntityManager를 생성하고,각각의 EntityManager는 db connection을 통해 db에 접근한다. 영속성 컨텍스트란?- 엔티티를 영구 저장하는 환경- EntityManager.persist(entity);를 통해 엔티티를 영속성 컨텍스트 안에 저장한다.- 영속성 컨텍스트는 논리적인 개념으로, 엔티티매니저를 통해서 영속성 컨텍스트에 접근한다.package hellojpa;import jakarta.persistence.*;public class JpaMain { /* jpa는 sql을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 */ public static void main(Stri..
웹 서버, 웹 애플리케이션 서버 모든 것이 HTTP HTTP 메시지에 모든 것을 전송 • HTML, TEXT • IMAGE, 음성, 영상, 파일 • JSON, XML (API) • 거의 모든 형태의 데이터 전송 가능 • 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용 • 지금은 HTTP 시대! ![](https://velog.velcdn.com/images/born_a/post/f21bd350-acec-473f-95ce-4efe363b08af/image.png) Http로 이 html 주세요라고 웹 서버에 요청을 하면 웹서버가 해당 html을 http 프로토콜로 응답을 준다. =>http 프로토콜로 서로 데이터를 주고 받을 수 있다 정적 데이터를 제공하는 것을 웹 서버라 한다. ## 웹 애플리케이..
@Rollback(value=false) 로 했을때 db 상에서 확인할 수 있다. package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframewo..
일대일 관계의 fk의 경우 access를 자주하는 테이블에 둔다. package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.Embeddable; import javax.persistence.Entity; @Embeddable // 어딘가에 내장이 될 수도 있다는 뜻 @Getter @Setter public class Address { private String city; private String street; private String zipcode; protected Address() { } public Address(String city, String street, String..
롬복을 사용하려면 enable annotation processing에 체크해줘야 한다. 롬복이 제대로 실행되었는지 확인 resource -> templates -> hello.html cmd + B : 그곳으로 이동 View 환경설정 스프링 부트 thymeleaf viewName 매핑 resources:templates/ +{ViewName}+ .html 렌더링 하지 않는 파일 -> static 폴더 렌더링 할 파일 -> templates 폴더 참고: spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이 View 파일 변경이 가능하다. Testcase 작성 중 에러 해결 https://jjunii486.tistory.com/166 스프링부트] J..
상속관계매핑 관계형 데이터베이스는 상속관계란게 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑 : 객체의 상속 구조와 db의 슈퍼타입 서브타입 관계를 매핑이다. 슈퍼타입 서브타입 논리모델을 물리모델로 변환하는 법 1. 각각 테이블로 변환 -> 조인 전략 2. 통합 테이블로 변환 -> 단일 테이블 전략 3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인전략(기본적 정석) 조인전략 선택 가능. 장점: 테이블의 정규화, 제약조건을 item에 걸어서 맞출 수 있다. 1.테이블의 정규화 2.외래키 참조 무결성 제약조건 활용가능 3. 저장공간 효율화 단점 1. 조회시 조인을 많이 사용, 성능 저하 2.조회 쿼리가 복잡 3. 데이터 저장시 insert sql 2번..
연관관계 매핑 시 고려사항 3가지 1.다중성 2.단방향, 양방향 3.연관관계의 주인 다중성 다대일 일대다 일대일 다대다 애매할때는 반대로 생각해보자.(대칭성이 있기 때문!) 다대다는 실무에서 쓰면 안된다. 테이블과 객체 테이블 - 외래키 하나로 양쪽 조인 가능 객체 - 참조용 필드가 있는 쪽으로만 참조 가능 - 한쪽만 참조하면 단방향 - 양쪽이 서로 참조하면 양방향 연관관계의 주인 - 테이블은 외래키 하나로 두 테이블이 연관관계를 맺음 - 객체 양방향 관계는 A-?B, B->A 처럼 참조가 2군데 - 객체 양방향 관계는 참조가 2군데있음 둘 중 테이블의 외래키를 관리할 곳을 지정해야 함 - 연관관계의 주인 : 외래키를 관리하는 참조 - 주인의 반대편 : 외래키에 영향을 주지 않음, 단순 조회만 가능 다 ..
객체를 참조하도록 변경! @Entity @Table(name="ORDERS") public class Order{ @Id @GeneratedValue @Column(name="ORDER_ID") private Long id; @ManyToOne @JoinColumn(name="MEMBER_ID") private Member member; } @Entity public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private long id; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } @OneToMany 는 당연히 컬렉션이 되어야지. 반대니까! 양방향 연..
· 스프링
스코프와 프록시 이번에는 프록시 방식을 사용해보자. @Component @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) // 값이 두개이상 들어갸야하므로 value 명시해줌 public class MyLogger { 여기가 핵심이다. proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해주자. 적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS 를 선택 적용 대상이 인터페이스면 INTERFACES 를 선택 이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다. 이제 나머지 코드를 Provide..
born-A
'스프링' 카테고리의 글 목록