springboot - blog project (17)

Yuri Lee·2020년 8월 21일
0

springboot - blog project

목록 보기
9/49

스프링부트 강좌 17강(블로그 프로젝트) - yml설정하기

1. yaml 이란
https://www.inflearn.com/questions/16184

이 글을 참고하자! yaml 포맷은 xml, json에 비해 가독성이 좋고 간편하다.

2. yml 설정
web.xml, root-context.xml, servlet-context.xml의 합본

root-context.xml : 보통 데이터 베이스 설정을 한다. 더 정확하게 말하면 한번만 new 되고 더이상 new 될 필요가 없는 것들, 싱글톤으로 알려진 것들...

servlet-context.xml : 한번만 new 하는 것들이 아니라 지속적으로 계속 new해서 사용해야 하는 것들이다.

지금은 이게 어떤 뜻인지 몰라도 된다. 스프링에서는 얘들을 건들이지 않는다.

스프링에서는 application.yml 파일만 설정하면 된다. 스프링 부트는 이 파일에 모든 설정을 하면 되고 그 규칙은yml 파일이다.

server:
  port: 8000
  servlet:
    context-path: /blog # 내 프로젝트에 들어가기 위핸 진입점 
    encoding:
      charset: UTF-8
      enabled: true
      force: true
    
spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
      
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Seoul
    username: cos
    password: cos1234
    
  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: false
    show-sql: true
    properties:
      hibernate.format_sql: true

  jackson:
    serialization:
      fail-on-empty-beans: false

스프링은 @Controller 이라는 어노테이션이 붙으면 메서드는 파일을 리턴한다. 어떤 파일을 리턴할까?

파일 기본경로: /src/main/resources/static
이 경로에 있는 home.html 파일을 리턴하라고 하는 것이다

리턴명: /home.html이라고 해야 한다
풀경로: /src/main/resources/static/home.html

@RestController 과는 조금 다르다. RestController은 스트링 문자 그 자체를 리턴했다면, @Controller는 해당 경로 이하에 있는 파일을 리턴해준다.

우리는 템플릿 엔진을 html 을 사용할 것이 아니라 jsp 파일을 리턴해줄 것이다. 하지만 스프링부트는 기본적으로 jsp 파일을 지원해주지 않는다. 따라서 (1) pom.xml 파일에 jsp 파일을 읽을 수 있는 라이브러리를, 의존성을 추가해줘야 한다. 그래야 jsp 가 동작할 수 있다. (2) 기본 경로가 static이기 때문에 이 static에 jsp 파일을 넣으면 제대로 인식하지 않는다. 왜? static 경로는 스프링이 정적 파일을 넣는 경로이다. static 이하에는 브라우저가 인식할 수 있는 것만 넣어야 한다.

그림과 같은 파일? .png...
jsp 파일을 찾아주기는 한다 .하지만 문제가 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test.jsp</h1>
</body>
</html>

위 test.jsp 파일을 못찾는다. 왜 몾찾을까? jsp 는 정적인 파일이 아니기 때문이다. 동적인 파일이다. java 파일이다. 컴파일이 일어나야 할 파일이다. 브라우저가 인식하지 못한다. 그래서 이 경로를 바꿔야 한다. 따라서 src/main/webapp/WEB-INF/views 폴더를 만들어준다. 그리고 views 안에 test.jsp 파일을 넣어줬다.

public String tempJsp() {
		// prefix: /WEB-INF/views/
		// suffix: .jsp
		// 풀경로 :  /WEB-INF/views/test.jsp
	return "test";
}

http://localhost:8000/blog/temp/jsp 에 접속하면 다음과 같이 접속이 완료된다. 컴파일이 된 것이다. 톰캣이 이 파일은 jsp 파일이니까 자바파일이네? 그러면 웹 서버인 아파치야, 이건 너가 할 수 있는 일이 아니니까, 톰캣인 내가 해당 파일을 컴파일 해서 html 로 던져줄게. 그럼 웹 브라우저가 지금처럼 이해할 수 있을거야 ~

(1) jasper

.jsp 경로를 설정한 이유는 스프링 부트는 기본적으로 jsp사용이 권장하기 않기 때문에 timeleaf 같은 다른 템플릿 엔진을 사용해야 한다. 하지만 jsp를 사용하기 위해서는 해당 구조로 폴더 구성을 한 뒤 세팅하여야 한다. (jasper)

(2) com.mysql.cj.jdbc.Driver

datasource 의 mysql 드라이버에 cj가 들어간 이유는 mysql 6점대 이상 버전부터는 해당 드라이버를 사용하고 그 이전 드라이버는 cj가 없는 com.mysql.jdbc.Driver를 사용한다.

(3) open-in-view

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 클래스
영속성을 프리젠테이션 계층까지 가져간다. 트랜잭션은 Service계층에서 종료된다. Transaction이 종료된 후에도 Controller의 Session이 close되지 않았기 때문에, 영속 객체는 Persistence 상태를 유지할 수 있으며, 따라서 프록시 객체에 대한 Lazy Loading을 수행할 수 있게 된다.

버전 2.0부터 스프링 부트는 기본적으로 OSIV가 활성화되어있을 때 경고를 발행하므로 프로덕션 시스템에 영향을 주기 전에 이 문제를 발견 할 수 있다.

서블릿 필터에서 Session 을 오픈하고 트랜잭션을 시작하던 전통적인 방식의 OPEN SESSION IN VIEW 패턴과 달리 SpringMVC 에서 제공하는 OpenSessionInViewFilter 는 필터 내에서 Session 은 오픈하지만 트랜잭션은 시작하지 않는다. 따라서 서블릿 필터 안에서는 커넥션 풀로부터 JDBC 커넥션을 얻을 필요가 없다.

hibernate.enable_lazy_load_no_trans: true
OSIV를 활성화 하였다면 위에 옵션을 필요 없다. 그리고 OSIV는 스프링부트가 디폴트로 활성화하고 있는 옵션이다. 경고를 제거하기 위해 명확하게 적어준 것 뿐!!

(4) ddl-auto

create - 서버 시작시마다 DB초기화

update - 수정사항만 DB에 반영

none - DB에 아무런 반영을 하지 않음.

(5) physical-strategy

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

엔티티를 만들 때 변수명 그대로 DB에 필드를 만들어 준다.

org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

엔티티를 만들 때 변수명에 언더스코어를 붙여준다. 예) createDate -> create_date

(6) show-sql: true

(7) use-new-id-generator-mappings: false

use-new-id-generator-mappings 는 mysql로 말하면 auto_increment 오라클로 말하면 시퀀스를 어떤식으로 사용할지 방식을 결정하는 것인데 false를 하면 jpa가 사용하는 기본 넘버링 전략을 따라가지 않는다는 뜻이고 true를 하면 기본 넘버링 전략을 따라간다는 뜻이다.

(8) jackson:
serialization:
fail-on-empty-beans: false

Lazy-loading으로 인해 empty-beans이 생길 수 있다. 너그럽게 빈 객체를 허락해주는 옵션이다.


-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-

profile
Step by step goes a long way ✨

0개의 댓글