WEB 커리큘럼 2주차 - 엔티티, 리포지터리를 통한 DB연결

이은지·2023년 9월 17일
0

GDSC-Web

목록 보기
2/7
post-custom-banner

1. SpringBoot 구조 및 흐름

💡SpringBoot의 흐름

  • 스프링은 Domain → Repository → Service → DTO → Controller 구조로 되어 있으며, 코드를 작성하는 순서도 이와 같다
  • Domain에서 DB와 관련된 클래스를 작성하고, Repository로 Domain에 작성된 필드 접근을 위한 CRUD를 작성하고 DTO로 어떤 테이블에 어떤 필드로 접근할지 정의한다
  • Service는 외부에서 해당 기능을 사용할 수 있도록 비즈니스 로직을 구현하고, 외부에서 요청이 오면 Controller를 통해서 Service로 DB에 접근하여 요청을 처리하게 된다

💡SpringBoot 구조 살펴보기

  • java 파일은 우리가 소스코드 적는 파일로 스프링 부트는 목적에 따라 여러 패키지를 생성하여 소스코드를 관리함
    • Domain(Entity)

    • Repository

    • Dto

    • Service

    • Controller

      보통 위의 구조로 구성됨

  • resources/template은 사용자에게 보여주는 뷰를 위한 템플릿임

2. 컨트롤러

  • 제일 앞단에서 HTTP의 요청과 응답을 위한 클래스
  • Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있음
  • 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restful 웹서비스의 컨트롤러인@RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식

💡@Controller

  • JSP, HTML과 같은 View를 반환할 때 주로 쓰임

    • 동작과정

      1. Client는 URI 형식으로 웹 서비스에 요청을 보냄.
      2. DispatcherServlet이 요청을 처리할 대상을 찾음
      3. HandlerAdapter을 통해 요청을 Controller로 위임.
      4. Controller는 요청을 처리한 후에 ViewName을 반환
      5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환
  • @ResponseBody 어노테이션을 활용해 Json 형태로 데이터를 반환할 수 도 있음

    • 동작과정

      1. Client가 URI 형식으로 웹 서비스에 요청을 보냄
      2. DispatcherServlet이 요청을 처리할 대상을 찾음
      3. HandlerAdapter을 통해 요청을 Controller로 위임
      4. Controller는 요청을 처리한 후에 ResponseEntity 태그로 감싸서 객체를 반환
      • 이때, 객체가 return되기 때문에 viewResolver 대신에 HttpMessageConverter가 동작하고, 반환되는 객체는 JsonConverter가 동작하게 되어 객체를 JSON형태로 바꿔 JSON 형태로 사용자에게 반환
        • 단순 문자열 처리: StringHttpMessageConverter
        • 기본 객체 처리: MappingJackson2HttpMessageConverter

💡@RestController

  • @ResponseBody + @Controller
  • @Controller에 @ResponseBody가 추가된 것으로 클라이언트에게 Json 형태로 객체 데이터를 반환할 때 주로 쓰임 (Json형식으로 프론트에게 API 제공)
  • 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환
  • 동작과정의 경우 @Controller에 @ResponseBody를 붙인 것과 동일

💡매핑의 종류

  • HTTP 요청을 매핑하는 여러가지 방법
    • @RequestMapping(value = ”url”, method = RequestMethod.GET)
    • @GetMapping(“url”)
    • @PostMapping
    • @DeleteMapping
    • @PutMapping

3. JPA와 ORM

웹서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다. 그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요함. 이때, ORM을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.

💡ORM(Object Relational Mapping)

  • 객체와 관계형 데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것
  • SQL query가 아닌 직관적인 코드로서 데이터를 조작할 수 있다
  • 객체와 쿼리를 분리하여 복잡도를 줄이고, 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있는 방법
  • 장점
    • ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다. 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다

💡JPA

  • Java Persistence API로 자바 ORM기술에 대한 API표준 명세
  • ORM을 사용하기 위한 인터페이스를 모아둔 것으로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • JPA는 어플리케이션과 JDBC 사이에서 동작
    • JDBC란?
      • DB에 접근할 수 있도록 자바에서 제공하는 API
      • 그림처럼 JPA는 JDBC를 통해 DB와 통신한다.

  • 인터페이스 이므로, JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus와 같은 ORM 프레임워크를 사용해야 함!

💡JPA 데이터베이스 방언

  • JPA는 어플리케이션이 직접 JDBC 레벨에서 SQL을 작성하는 것이 아니라 JPA가 직접 SQL을 작성하고 실행하는 형태이다
  • 그런데, 수많은 DBMS 종류가 있고 각 종류마다 사용하는 SQL 문법이 다르므로 종류에 맞게 사용할 필요가 있음
  • JPA에서는 이를 Dialect라는 추상화된 방언 클래스를 제공하여 각 DBMS 벤더에 맞는 구현체를 제공

  • 설정 방법

4. 엔티티(도메인)

  • 데이터베이스 테이블과 매핑되는 자바 객체
  • DB의 테이블과 컬럼, 타입 및 크기 등을 설정할 수 있음

💡어노테이션 정리

  • @Entity - 테이블과 1:1로 핑되는 어노테이션으로 해당 어노테이션을 클래스에 붙이면 jpa가 해당 클래스를 관리한다.
  • @Column - 필드에 붙이는 어노테이션으로 해당 어노테이션을 붙이면 컬럼으로 인식한다.
  • @Id - PK를 지정하는 어노테이션이다.
  • @GeneratedValue - pk가 중복되는것을 방지하기 위해 작성하는 어노테이션. strategy 파라미터로 GenerationType.IDENTITY를 주게되면 PK로 인식하여 Auto Increament로 설정된다.
  • @Builder - Builder 패턴을 사용하기 위한 어노테이션. @Builder 어노테이션을 사용하게되면 객체를 생성할때 생성자를 통해서 객체를 생성하는게 아니라 도메인.builder().필드(값).필드(값).build(); 를 통해 필드에 대한 값을 좀더 명시적으로 넣을 수 있음
  • @OneToMany: 1:N 연관관계를 가짐 (질문에서 답변으로)
  • @ManyToOne: N:1 연관관계를 가짐 (답변에서 질문으로)

(참고)
https://goodgid.github.io/What-is-Dialect/
https://may9noy.tistory.com/868

profile
소통하는 개발자가 꿈입니다!
post-custom-banner

0개의 댓글