본문 바로가기
BackEnd

[JPA] Spring과 JPA-1

by mizuiro 2024. 7. 29.

1. Srping

1.1 배경

  • EJB(Enterprise Java Bean) 로 개발 시 어렵고, 무거운 것이 단점
  • ⇒ 경량 프레임 워크의 필요성이 대두 ⇒ Spring
  • 애플리케이션에서 사용되는 여러 가지 빈(클래스 객체)를 개발자가 아닌 스프링 프레임 워크가 권한을 가지고 직접 관리하는 특징이 있음
  • ( 약한 결합 )
  • model 2 에서는 controller 가 요청 처리를 위해서 해당 dao 가 필요함⇒ 느슨한 결합을 제공해주는 것이 spring 임( DI 개념을 활용 )
  • ⇒ 강한 결합 대신에 느슨한 결합이 되도록 개발을 해야 함

1.2 특징

  • EJB 보다 가볍고 배우기 쉽고, 경량 컨테이너의 기능을 수행함
  • 제어역행 (IoC, Inversion of Control) 기술을 이용해 애플리케이션 간의 느슨한 결합을 제어
  • 빈(Bean, 클래스 객체) 등을 개발자가 코드 레벨에서 생성하지 않고 프레임워크가 생성하여 사용하는 방법
  • 의존성 주입 (DI, Dependency Injection) 기능을 지원
  • Controller 와 DAO 처럼 의존관계에 있는 빈을 프레임워크가 관계를 맺어줌
  • 관점 지향(AOP, Aspect-Oriented Programing) 기능을 이용해서 자원 관리를 수행
  • 핵심 기능 외에 부수적인 기능들을 분리 구현함으로써 모듈성을 증가시키는 방법
  • 다양한 라이브러리와의 연동 기능을 지원

1.3 스프링 프레임워크의 구성

  • Core : IoC 기능을 제공
  • Context : 빈에 대한 접근 방법을 제공
  • ORM : Mybatis 같은 영속성 관련 프레임워크와 연동된 기능을 제공
  • Mybatis : Sql Mapper Framework
  • AOP : 관점 지향 기능을 제공
  • WebMVC : 스프링에서 MVC 구현에 관련된 기능을 제공

1.4 의존성 주입(DI)

  • 빈 간의 의존관계를 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라 컨테이너(Spring) 가 연관관계를 직접 규정하는 것
  • ⇒ 약한 결합 (loosely coupled)

의존성 주입 방법

  1. xml 을 활용
    • xml file 에 사용할 클래스(bean)를 등록id 는 인스턴스 변수처럼 사용하게 됨
    • id, class 의 속성 정보를 등록해서 사용
    • XmlBeanFactory 클래스를 이용해서 xml file 정보를 읽음
    • BeanFactory.getBean() 의 매개변수로 xml 의 id를 이용하여 객체를 반환받음
    • 반환된 객체를 이용하여, 메소드를 호출하여 사용
  2. Annotation 이용

1.5 관점지향 프로그래밍(AOP)

  • 애플리케이션 개발 시 트랜잭션, 예외처리, 로그 기록 등의 기능은 공통적으로 사용되는 기능
  • 비즈니스 로직 처리 시 이런 공통 기능을 모든 곳에서 구현을 하게 되면, 유지보수가 점점 더 힘들어지게 되므로 이런 부분을 모듈화 할 필요성이 존재
  • 이러한 문제 해결을 위해 관점 지향 프로그래밍으로 해결할 수 있음
  • AOP 는 메소드 안의 주 기능과 보조 기능을 분리한 후 선택적으로 적용해서 사용한다는 개념
  • AOP 를 사용하게 되면 보조 기능을 하나의 장소에 모아서 관리 가능
  • 보조 기능을 주기능에서 선택적으로 적용할 수 있기에 코드가 단순해지고 가독성이 향상되게 됨

AOP 사용 방법

advice : 부기능

aspect(보조기능) 의 실제 구현체를 의미함

target : 주기능

advice가 적용되는 클래스를 의미함

예시

AOP 적용전

log.info(); // AOP 의 부기능(advice)이 됨
cal.add(100,200); // 주기능 (target)이 됨
log.info(); // AOP의 부기능(advice) 이 됨

AOP 적용 후

// 관심사(비즈니스 로직) 가 분리 됨, 유지보수, 가독성, 모듈화가 가능
cal.add(100,200); 

AOP 가 많이 적용되는 부분 : 로깅, 보안, 트랜잭션 등

1.6 Spring MVC

특징

  • 모델 2 아키텍처 지원
    • 모델 1
    • view 와 logic(controller)를 jsp 페이지 하나에서 처리하는 구조
    • 모델 2
    • view와 controller(servlet) 가 분리되는 구조

구조

  • DispatcherServlet
  • 클라이언트의 요청을 받아서 해당 요청에 대한 컨트롤러를 선택하여 요청을 전달
  • HandlerMapping
  • 클라이언트가 요청한 URL을 처리할 컨트롤러를 지정
  • Controller스프링 프레임워크에서 제공하는 controller 를 상속받아서 구현해야 함
  • 단일 액션 컨트롤러와 다중 액션 컨트롤러가 존재
  • 클라이언트의 요청을 처리한 후 그 결과를 DispatcherServlet 에 전달
  • ModelAndView
  • 컨트롤러가 처리한 결과 및 뷰 선택에 필요한 정보를 저장
  • ViewResolver
  • 컨트롤러의 처리 결과를 전달할 뷰를 지정 JSP를 지정
  • View
  • 컨트롤러의 처리 결과 화면을 생성함 JSP 가 됨

1.7 Annotation (어노테이션)

  • 클라이언트 요청을 매핑, 데이터 바인딩, 빈 주입 등을 XML 대신에 어노테이션으로 설정
  • 종류@Service : 지정한 클래스를 서비스 Bean으로 자동 변환@Component : 지정한 클래스를 Bean으로 자동 변환
  • 어노테이션으로 지정된 클래스들은 스프링 실행 시 자동으로 빈으로 생성 됨
  • @Repository : 지정한 클래스를 DAO Bean으로 자동 변환
  • @Controller : 지정한 클래스를 컨트롤러 Bean 으로 자동 변환

2. Spring 과 Tomcat 서버

2.1 애플리케이션 실행 흐름

  1. server의 context.xml에 배포된 애플리케이션의 WEB-INF/web.xml 찾는다
  2. 애플리케이션의 WEB-INF/web.xml 에서 Spring container 설정 파일 찾기
    1. classpath:spring/business-layer.xml
  3. 애플리케이션의 WEB-INF/web.xml 에서 Spring MVC 설정 파일 찾기
    1. /WEB-INF/spring/presentation-layer.xml
  4. src/main/resources spring/business-layer.xml 에서 JPA, EntityMangaerFactory, Transaction 등 정보값 설정
  5. presentation-layer.xml 에서는 클라이언트 요청에 대한 응답 페이지 정보 완성
  6. viewResolver의 속성 prefix, suffix 정보를 설정
  7. 상기의 설정 정보를 바탕을 웹 애플리케이션 서비스 준비가 됨

2.2 스프링 요청 처리 흐름

Client( 웹 브라우저 ) request → Dispatcher Servlet → Controller → ModelandView 반환 → ViewResolver → response 정보 완성 → Client 응답

Model : Controller 에서 처리한 데이터(JPA 를 통한)를 저장

View : 클라이언트에게 보여 줄 페이지 경로 및 이름을 저장

2.3 회원가입의 처리 순서

  • 클라이언트의 request (서버로 요청)
  • http://localhost:8080/customer/new → insertCustomer.jsp
  • 요청에 대한 처리를 위해서 메소드를 찾아야 함
  • <form action="/customer/new" method="post">
  • CustomerController 에서 @PostMapping(”/customer/new”) 로 설정된 insertCustomer() 호출
  • Service , Repository (JPA, H2DB)
  • request 처리에 대한 response 처리 ⇒ return "redirect:/getCustomerList";

response 에 대한 처리 방법 : redirect(클라이언트가 요청) , forward(서버에서 자체적으로

클라이언트가 /getCustomerList 를 다시 요청하는 것

⇒ controller의 요청 매핑 중에서 “/getCustomerList” 를 매핑

⇒ @GetMapping("/getCustomerList") 로 설정된 메소드를 호출

⇒ getCustomerList() 메소드가 호출됨

⇒ DB에서 조회된 사용자 정보 리스트를 Model(key, value)에 저장함

⇒ View 정보 생성

ViewResolver 가 prefix, suffix 정보를 합쳐서 view 정보를 완성

prefix + “customer/getCustomerList” + suffix

WEB-INF/jsp/ + “customer/getCustomerList” + .jsp

⇒ Model 에 저장된 사용자 리스트 정보를 getCustomerList.jsp 에 display 해야함 (model, view)

⇒ response page 가 완성이 되어 클라이언트에게 전송

3. Servlet

  • 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스
  • 톰캣과 같은 JSP/Servlet 컨테이너에서 실행됨

3.1 Servlet 의 단점

  • 클라이언트에게 html로 만들어서 전송을 해야 함
  • Servlet은 java, html(javascript, css) 로 구성이 됨
  • ⇒ 개발자와 디자이너의 협업이 힘들어짐 ⇒ JSP 탄생

Servlet 이 java 와 화면(JSP)이 분리가 되게 됨

내부적으로 JSP는 servlet 으로 컴파일 되고, tomcat 에서 실행됨

  • 생명주기 (스레드, 톰캣)작업수행 : doGet(),get 방식의 요청에 대한 처리, doPost() post 방식의 요청에 대한 처리
  • 종료 : destroy()
  • 초기화 : init()

4. MVC (model2) 구성 요소와 기능

  • Controller :
    • Servlet 이 Controller의 역할을 함
    • 클라이언트의 요청을 분석
    • 요청에 대한 필요한 모델을 호출
    • Model 에서 처리한 결과를 보여주기 위해서 JSP 를 호출
  • Model :
    • 데이터베이스 연동과 같은 비즈니스 로직을 처리
    • 일반적으로 DAO (Data Access Ojbect) 로 불림
  • View :
    • JSP 가 담당
    • Model(key, value)에서 처리한 결과를 화면에 표시

5. Entity 의 연관 관계

  • Customer
  • Order
  • Product
  • Item

Customer ↔ Order

Order ↔ Item ↔ Product

⇒ ITEM 이 없으면 Order 와 Product는 서로 다대다 관계

⇒ Item 이 있으므로, 다대일 또는 일대다 관계 ⇒ 비식별 관계

  • entity의 다대다 연관관계 매핑
    • entity 두 개로 관계 설정하는 방법
    • 식별 관계 (연관 관계 클래스 존재)
      • Order, Product 의 PK를 FK로 해서 복합키로 사용
    • 비식별관계 (연관 관계 클래스 존재)
      • Order, Proudct 의 PK를 FK로 존재하고 새로운 PK를 생성하여 사용

5.1 상품 주문

  1. 주문화면 생성
    • header.jsp, /order/new 링크를 통해서 서버로 요청
    • OrderController.insertOrder(Model model)
    • 회원 리스트(customerList) 와 상품 리스트(productList)를 조회해서 Model 에 저장
    • order/insertOrder 를 반환 ⇒ view화면 정보 생성
      • ⇒ /WEB-INF/jsp/order/insertOrder.jsp
  2. 주문화면에서 주문 정보 입력
    • insertOrder.jsp<form action="/customer/new" method="post">
    • 주문 정보 입력 후 “상품 주문” 버튼 클릭 ⇒ 주무능ㄹ 서버로 요청 (request송신)
    • 서버에서 request 를 수신
    • 서버 클래스 호출주문 처리를 위한 1,2,3 번에 대한 처리(orderService 참조)
    • ⇒ 서버 차원에서 요청된 주문이 완료가 됨 ⇒ client 에게 response 가 필요함
    • OrderService.insertOrder(customerId, prouctId, count)
    • response(View 생성해 전달)클라이언트(브라우저)가 OrderController.getOrderList() 를 호출함주문 목록 리스트를 Model(orderList) 에 저장
    • 주문 목록 조회
    • redirect:/getOrderList
    • response view생성

'BackEnd' 카테고리의 다른 글

[JPA] Spring과 JPA-3  (0) 2024.07.31
[JPA] Spring과 JPA-2  (0) 2024.07.30
[JPA] JPQL 연산자와 함수  (0) 2024.07.25
[JPA] groupping과 subquery  (0) 2024.07.24
[JPA] JPQL  (0) 2024.07.22