본문 바로가기

프로그래밍/Spring18

[JPA] 프록시와 연관관계 프록시 Member가 Team을 참조하고 있다면, Member를 조회할 때 Team도 참조해야 하는가? 회원만 필요한 경우도 있고 팀도 필요한 경우가 존재하는데 최적화는? 프록시 기초 1. em.find() vs em.getReference() 2. em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 3. em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 1. 실제 클래스를 상속 받아서 만들어진다. 2. 실제 클래스와 겉 모양이 같다. 3. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. (이론상) 4. 프록시 객체는 실제 객체의 참조(target)를 보관한다. 5. 프록시 객체를 호출하면 프록시는 실제 .. 2023. 8. 11.
[JPA] 상속관계 매핑 상속관계 매핑 1. 관계형 데이터베이스는 상속 관계X 2. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 3. 상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼 타입 서브 타입관계를 매핑 각각의 테이블로 변환 => 조인 전략(각각 INSERT하고 조회할 때 JOIN사용) 통합 테이블로 변환 => 단일 테이블 전략(모든 필드를 하나의 테이블에) 서브타입 테이블로 변환 => 구현 클래스마다 하나의 테이블(부모 클래스는 따로 만들지 않는다) 조인 전략 장점 1. 테이블 정규화 2. 외래키 참조 무결성 제약 조건 활용 가능 3. 저장 공간의 효율화 단점 1. 조회시 조인을 많이 사용(성능 저하) 2. 데이터 저장시 INSERT문 2번 3. 조회 쿼리가 복잡함 단일 테이블 전략 장점 1. 조인이 필요 .. 2023. 8. 10.
[JPA] 영속성 관리 JPA에서 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 영속성 컨텍스트 1. EntityManager.persist(entity) 2. JPA를 이해하는 가장 중요한 용어 3. "엔티티를 영구 저장하는 환경" 4. 영속성 컨텍스트는 논리적인 개념이다. (눈에 보이지 않음) 5. 엔티티 메지저를 통해 영속성 컨텍스트에 접근한다. 엔티티의 생명주기 1. 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2. 영속(managed) 영속성 컨텍스트에 관리되는 상태 3. 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 4. 삭제(removed) 삭제된 상태 영속성 컨텍스트의 이점 1. 1차 캐시 사용(같은 트랜잭션 내에서) 2. .. 2023. 8. 10.
[JPA] 왜 JPA를 사용해야 하는가? SQL 중심적인 개발의 문제점 1. CRUD 코드를 매번 작성해야 한다. 2. 자바 객체를 SQL로, SQL을 자바 객체로 3. 객체와 관계형 데이타베이스의 패러다임 불일치 만약 중간에 필드라도 추가되면? 관련된 모든 쿼리를 수정해야 한다... public class Member { private String memberId; private String name; ... } INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES SELECT MEMBER_ID, NAME FROM MEMBER M UPDATE MEMBER SET … 객체와 관계형 데이터 베이스의 차이 1. 상속 2. 연관관계 3. 데이터 타입 4. 데이터 식별 방법 객체를 테이블에 저장하려면... 각각 객체에 맞는 쿼리.. 2023. 8. 10.
[Spring] 스프링 MVC 구조 스프링 MVC는 프론트 컨트롤러 패턴으로 되어있다. (DispatcherServlet) 1. HTTP 요청이 들어오면 DispatcherServlet이 핸들러를 조회한다. (매핑된 주소에 매칭되는 handler를 찾는다) 2. Handler Adapter를 찾아온다. (다양한 형태 Controller 함수를 지원하기 위함) 3~4. 핸들러 어댑터를 통해 핸들러의 처리를 실행한다. (Controller의 내부 구현을 따른다) 5~6. ModelAndView를 반환하면 이를 viewResolver에게 넘긴다. 7. ViewResolver가 뷰를 찾아서 반환하면 렌더링한다. 주요 인터페이스 목록 핸들러 매핑: org.springframework.web.servlet.HandlerMapping 핸들러 어댑터: .. 2023. 8. 10.
[JPA] 테이블 연관관계 정리 ORM 사용 이유 객체의 참조 방식과 관계형 DB의 연관관계는 다르다. 예를 들어 Table의 외래값을 그대로 객체로 옮긴다면 **Id 형태의 필드를 선언하지만 객체의 개념에서 다른 객체를 참조하는 개념은 아니다. 물론 Id값을 이용하여 조회하는데 사용할 수는 있지만, 객체지향 프로그래밍답지 않다. 따라서 테이블의 외래키 대신 참조 값을 넣고 어노테이션을 이용하여 테이블의 연관관계를 정의하는 것이다. 프로그래밍을 할 때는 OOP처럼 코드를 작성하되, DB에 저장할 때는 외래키로 매핑해주는 것이다. 객체 A와 B가 있다면 A에서 B로의 참조, B에서 A로의 참조를 가질 수 있다. 다만 테이블의 경우에는 한쪽 테이블에 외래키가 존재하는 경우 A테이블로 B를 JOIN, B테이블로 A를 JOIN하므로 방향을 가.. 2023. 8. 6.
[JPA] 어노테이션 정리 @Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. 기본 생성자를 필수적으로 가지고 있어야 한다. final 클래스와 enum, interface, inner 클래스에는 사용되지 않는다. 저장할 필드에 final을 붙이지 말아야 한다. (너무 당연한 이야기) @Table 운영 장비에서 절대 create, create-drop, update 속성을 사용하지 마라. 초기 단계에는 create 또는 update 테스트 서버는 update 또는 validate 스테이징과 운영 서버는 validate 또는 none @Column name: 이름 insertable, updatable: 데이터 추가 여부 / 업데이트 가능 여부 Length: 길이 Column Definition: 직접 생성 .. 2023. 8. 5.
스프링 부트에서 JSP 파일 못 찾는 이슈 해결 과정 김영한 선생님의 강의를 보던 중이었다. 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의에서 'JSP로 회원 관리 웹 애플리케이션 만들기' 부분이다. 관련 내용: https://www.inflearn.com/questions/626836 당시 static 폴더에 index.html과 basic.html을 둔 상태로 jsp/members 폴더를 만들고 new-form.jsp 부분을 작성했다. 문제는 jsp 파일에서 404(not found) 이슈가 발생했다. 김 선생님께서 올려주신 프로젝트 파일을 토대로, application.properties 파일을 업데이트하고 webapp 폴더 구조, jsp 디펜던시 추가 등 다양한 작업을 했으나 여전히 동작하지 않았다. 버전이 문제인가 싶어서 spring 버전.. 2023. 7. 29.
[Spring] 변경 감지와 병합(merge) 상품 수정 실행 상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음 1. 상품 수정 폼에서 정보를 수정하고 Submit 버튼을 선택 2. /items/{itemId}/edit URL을 POST 방식으로 요청하고 updateItem() 메서드를 실행 3. 이때 컨트롤러에 파라미터로 넘어온 item 엔티티 인스턴스는 현재 준영속 상태다. 따라서 영속성 컨텍스트 의 지원을 받을 수 없고 데이터를 수정해도 변경 감지 기능은 동작X @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book boo.. 2023. 7. 25.
[Spring] 컴포넌트 스캔 컴포넌트 스캔과 의존관계 자동 주입 1. 스프링은 AppConfig를 만들어서 @Bean 어노테이션을 주는 방식이 아닌, 컴포넌트 스캔 방식을 제공한다. 2. 의존관계를 자동으로 주입하는 @Autowired 기능을 제공한다. 3. @Component 어노테이션을 클래스에 붙이면 Bean 객체로 할당이 된다. AutoAppConfig.java package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import.. 2023. 7. 16.