[16주차] 스프링부트, ORM, REST

이맑음·2024년 3월 18일

Java 수업 필기

목록 보기
15/15

용어

스프링 컨테이너

스프링 안에서 동작하는 빈 생성 및 관리 주체

스프링 컨테이너가 생성하고 관리하는 객체

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

핵심 관점, 부가 관점으로 나누어 프로그래밍 하는 것

톰캣

  • 웹서버 란
    지정된 포트로 요청이 들어오면 통신 채널을 확보한다
    포트로 들어온 요청을 톰캣 엔진에게 넘긴다
    요청에 대해 httpservletrequest, httpservletresponse를 response에 담아서 반환한다

스프링과 스프링 부트 차이점

root-context.xml -> application.properties로 변경

스프링 부트

특징

  1. auto configuration : 자동 설정
  2. 내장 서버
  3. 단독 실행 가능한 도구

application.properties

스프링에서 xml 파일로 나눠져 있던 설정들을 application.properties에서 간단하게 설정할 수 있다
ex) log4j2.xml, root-context.xml에서 설정한 로그레벨, data source 설정들을 아래와 같이 간단하게 설정 가능하다

#서버 연결 설정
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:포트번호/db이름
spring.datasource.username=사용자이름
spring.datasource.password=비밀번호

#로그파일 설정
logging.level.org.springframework=info
logging.level.com.프로젝트그룹=debug

웹 개발

  1. web.xml이나 servlet-context.xml이 없는 환경에서 개발한다
  2. 설정을 위한 @Configuration이나 상속 등을 사용한다
  3. 스프링부트는 기본적으로 JSP를 지원하지 않는다

@Controller vs @RestController

@Controller : Thymeleaf 사용 -> 서버사이드 템플릿 , HTML의 구조에 추가적인 태그없이 선언적으로 데이터 바인딩 처리
Model에 값을 담아야하며, html 파일이 필요하다
템플릿 : JSP처럼 데이터를 생성하지 않고, 만들어진 결과에 데이터를 맞추어서 보여준다
동작 방식은 비슷하나 처리 방식이 다르다

/controller/SampleController.java
@Controller
@Log4j2
public class SampleController {

    @GetMapping("/hello")
    public void hello(Model model){
        log.info("hello.........");
        model.addAttribute("msg","hello world");
    }
}
/resources/templates/hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>

@RestController : 순수하게 데이터만 송수신한다
별도의 라이브러리 없이 스프링부트는 기본적으로 JSON 처리를 지원한다

/controller/SampleJSONController
@RestController
@Log4j2
public class SampleJSONController {

    @GetMapping("/helloArr")
    public String[] helloArr() {
        log.info("helloArr.................");
        return new String[]{"AAA", "BBB", "CCC"};
    }
}

ORM

자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
ORM을 이용한 자바 객체와 관계형 데이터베이스 매핑 : java obejct <--> OR <--> Relational Database

JPA

ORM의 종류 중 하나
자바는 JPA를 표준으로 사용
java persistence API
자바에서 관계형 데이터베이스를 사용하는 방식을 정의한

장점

특정 데이터베이스에 종속되지 않는다
객체지향적 설계 가능
유지보수 유리
생산성 향상

단점

복잡한 쿼리 처리
성능 저하의 위험성
배우는데 시간이 꽤 걸림

하이버네이트

JPA 인터페이스를 구현한 구현체 = 실제 코드에서 사용
애플리케이션<-->스프링 데이터 JPA
                 <-------------------------->JPA | 하이버네이트 | JDBC <--> 데이터베이스


  • jpa 수정이나 삭제 시 select문이 먼저 실행되는 이유
    jps를 이용하는 것은 영속 컨텍스트와 데이터베이스를 동기화하여 관리한다는 의미미앋
    특정한 엔티티 객체가 추가되면 영속 컨텍스트가 추가되고 데이터베이스와 동기화가 이루어진다
    수정이나 삭제시 영속 컨텍스트에 해당하는 엔티티 객체가 존재해야하므로 먼저 select로 엔티티 객체로 영속 컨텍스트에 저장하고 이를 삭제한 후 실제 delete가 이루어진다

pageable와 page< E>

페이징 처리는 pageable 타입의 객체를 파라미터로 전달하여 구현한다
PageRequest.of() 기능을 이용하여 개발한다
PageRequest.of(페이지 번호, 사이즈) : 페이지 번호는 0부터 시작한다
PageRequest.of(페이지 번호, 사이즈, sort)

쿼리 메소드

Page findByTitleContiningOrderByTnoDesc(String keyword, Pageable pageable)
@Query -> JPQL
@Query 어노테이션의 value로 작성하는 문자열을 JPQL

Querydsl

JPA의 구현체 하이버네이트 프레임워크가 사용하는 HQL을 동적으로 생성하는 프레임워크
자바코드를 이용하여 타입의 안전성을 유지한 상태에서 원하는 쿼리를 작성할 수 있다
Querydsl을 이용하면 Q도메인이라는 객체 존재
목적 : 타입 기반으로 코드를 이용해서 JPQL쿼리를 생성하고 실행하는 것


목표
1. spring data jpa를 이용해서 영속 계층 처리
2. 타임리프를 이용해서 화면처리
3. 스프링 부트를 이용한 컨트롤러와 서비스 처리
구현
1. 서비스 계층과 DTO 구현
BoardRepository의 메소드는 서비스 계층을 통해서 DTO로 변환되어 처리되도록 구성한다
엔티티 객체는 영속 컨텍스트에서 관리되므로 가능하면 많은 계층에서 사용되지 않도록 구성한다
ModelMapper 를 이용한다

REST방식의 서비스

특정한 uri + http 메서드 --> '특정한 자원(resource)에 특정한 작업'을 지정하는 방식

Ajax

브라우저에서 서버를 호출하지만 모든 작업이 브라우저내에서 이루어지므로 현재 브라우저의 화면의 변화없이 서버와 통신할 수 있도록
자동완성, 지도 서비스
js+xml-->js+json

  • url : 이곳에 가면 당신이 원하는 것을 찾을 수 있습니다
  • uri(자원 식별자) : 당신이 원하는 곳의 주소는 여기 입니다

get /boards/123 123번 게시물 조회
post /boards/ 신규 게시물 등록(신규 게시물에 대한 데이터)
put /boards/123 123번 게시물 수정(수정에 필요한 데이터)
delete /boards/123 123번 게시물 삭제


JPA 연관관계 판단기준
1. 항상 변화가 많은 쪽으로 결정
2. ERD에서 FK 기준으로 결정
예) 회원--게시물 관계
1. 게시물은 회원에 의해서 작성된다
2. 회원이 게시물을 작성한다
회원이 게시물을 작성하고 게시물에 여러 개의 파일과 댓글이 있고
각 게시글에 회원의 좋아요(like)가 있고, ...


객체지향 JPA방식과 관계형 데이터베이스와 다름점을 구분해서 정리

0개의 댓글