[Spring Boot] 스프링부트 (IntelliJ) 31

[JPA] CascadeType 영속성 전이

위 사진처럼 엔티티를 설계할 때 사용 - CascadeType.ALL : 모든 Cascade를 적용 - CascadeType.PERSIST : 엔티티를 영속화할 때, 연관된 엔티티도 모두 적용 - CascadeType.REMOVE : 엔티티를 제거할 때, 연관된 엔티티도 모두 제거 - CascadeType.MERGE : 엔티티 상태를 병합할 때, 연관된 엔티티도 모두 병합 - CascadeType.DETACH : 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 X - CascadeType.REFRESH : 상위 엔티티를 새로고침할 때, 연관된 엔티티도 모두 새로고침

[JPA] 엔티티 설계시 주의점

1. 엔티티에는 가급적 Setter를 사용하지 말자 - Setter가 모두 열려있다면, 변경 포인트가 너무 많아서 유지보수가 어렵다. - Setter말고 같은 기능을 하는 메서드를 만들어서 사용한다. 2. 모든 연관관계는 지연로딩으로 설정한다. - 즉시로딩(EAGER)과 지연로딩(LAZY)이 있는데 - 즉시로딩은 하나의 엔티티를 로딩할 때 연관 된 데이터를 모두 불러오는 것 - 지연로딩은 필요한 시점에 연관된 엔티티의 데이터만 불러옴 - 연관된 엔티티를 함께 DB에서 조회해야 하면, fetxh join 또는 엔티티 그래프 기능을 사용한다. - @OneToOne, @ManyToOne관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야 한다. 3. 컬렉션은 필드에서 초기화 한다. - null 문제에서 안전..

[SpringBoot] Junit - @SpringBootTest, @Transactional 어노테이션

@SpringBootTest 스프링 컨테이너와 테스트를 함께 실행한다 @Transactional 테스트할 때 DB에 반영된 것들을 테스트가 끝나면 rollback 해주어 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다. 테스트 파일을 만들 경우 스프링 컨테이너 없이 '단위테스트'를 하는 것이 좋은 테스트라고 한다. MemberServiceTest 같은 경우는 단위테스트 class MemberServiceTest { MemberService memberService; MemoryMemberRepository memberRepository; @BeforeEach public void beforeEach(){ memberRepository = new MemoryMemberRepository()..

[Spring Boot] DI (의존성 주입, Dependency Injection)

DI는 코드 간의 의존 관계를 관리하기 위한 디자인 패턴이다. 회원관리를 예를 들어 설명을 하자면, MemoryMemberRepository에는 기본적인 기능 (가입, 전체조회, ID로 검색, Name으로 검색 등등) MemberService에는 그 외에 비즈니스적인 기능(부가적인 기능)을 작성한다고 한다. 부가적인 기능을 이용할 때는 기본적인 기능을 이용할 때가 많다. 예를 들면 기본적인 기능에는 회원 정보가 저장되는 기능이 있다면 부가적인 기능에는 사용자가 입력한 내용이 중복확인이나 조건을 거쳐 모든 조건에 충족이 된다면 회원정보가 저장되는 기능이 작동하는 것이다. 회원 정보가 저장되는 기본적인 기능 @Override public Member save(Member member) { member.set..

[Spring Boot] Junit 사용해보기

테스트를 하다가 이런 에러가 발생했다. package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.*; class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @Test public void save(){ Member member = new Memb..

[JPA] Mysql JPA 테이블 추가하기

전에 했던 내용을 복습하기 위해 Member 테이블을 하나 더 생성했다 persistence.xml 파일에 jpabasic.reserve.domain.Member 를 추가했다. jpabasic.reserve.domain.User jpabasic.reserve.domain.Member true 테이블과 일치하게 VO도 추가하여 작성했다 package jpabasic.reserve.domain; import jakarta.persistence.*; import java.time.LocalDateTime; @Entity @Table(name = "member") public class Member { @Id private String email; private String name; @Column(name =..

[Spring boot] 스프링 컨테이너 - response 하는 방법

웹이 동작하는 순서 1. 서버가 켜지면서 web.xml이 호출됨 2. ContextLoaderListener가 호출됨 (성이 만들어짐) 3. applicationContext.xml, root-context.xml이 읽어지면서 DB관련 객체들 메모리에 올림 (service, DAO, VO등) 4. 사용자의 request요청이 들어옴 5. DispatcherServlet이 웹과 관련된 것들을 메모리에 띄움(주소분배) 6. response 응답이 감 (Data or html) 1. 요청 주소에 따른 적절한 컨트롤러 요청 (handler Mapping) GET 요청 -> http://localhost:8080/post/2 해당 주소 요청이 오면 주소에 맞는 적절한 컨트롤러의 함수를 찾아서 실행한다. 2. 응답..

[Spring boot] 스프링 컨테이너 - request 과정

request -> web.xml -> ContextLoaderListener ->DispatchServlet(컴포넌트 스캔 > 주소 분배) ContextLoaderListener - 모든 자원들이 공통적으로 사용할 것들을 만들어둠 ex)DBConnector - 어노테이션(ex -@Controller, @Restcontroller, @Configration 등)을 가지고 있는 것들을 모두 메모리에 띄움 - 어노테이션을 커스텀 할 수도 있음 servlet-applicationContext - controllers, viewResolver, HandlerMapping를 메모리에 띄우고 관리함 - 웹만 바라보는 어노테이션을 스캔하고 ContextLoaderListener에 의해 실행됨 root-applicat..

[Spring boot] FrontController, RequestDispatcher, DispatchServlet

FrontController - 최초 앞단에서 request를 받아서 필요한 클래스에 넘겨준다. - 이 때 새로운 요청이 생기기 때문에 reuqest와 response가 새롭게 new 될 수 있다. - request와 response가 새로 생기면 요청한 페이지로 넘어갈 때 데이터를 가지고 갈 수 없다. RequestDispatcher - a페이지에서 b페이지로 넘어갈 때, a페이지에서 가지고 있던 데이터를 가지고 넘어갈 수 있음 - 페이지가 넘어갈 때 request가 다시 생성되지 않고 a페이지에서 생성된 request를 재사용함 Dispatchservlet - 스프링에 이미 있는 기능으로 FrontController + RequestDispatcher 합쳐진 기능을 가지고 있다.