SpringBoot 블로그 만들기 - yaml 설정, jsp 연결

정원·2022년 11월 17일
0

SpringBoot

목록 보기
7/34

2022.11.26 yaml 설정

1. yaml 이란

Xml과 Json 파일 포맷은 많이 들어보셨는지요?

아마 많이 쓰고 계실 걸로 생각 됩니다. 그럼 이런 포맷들은 왜 사용할까요?

그걸 먼저 설명드리면,

우리가 타 시스템 간에 데이터를 주고 받을 때 데이터 포맷에 대한 약속이 필요합니다.

혼자 시스템을 개발하거나 내부 시스템 끼리는 "1-김태민-강사,2-아무개-학생" 이라는 문자열을 만들어서 "-(하이픈)"을 파싱해서 순서대로 "1"은 일련번호, "김태민"은 이름, "강사"는 구분이라는 규칙과, ",(콤마)"는 리스트를 나타내는 구분자라는 규칙을 세울 수 있을 겁니다.

그럼 데이터를 내부 시스템에 전송할때 포맷에 대한 형태는 말로써 혹은 내부 문서로써 정의해 놓으면 되기 때문에 데이터 크기는 엄청 작아 질 수 있겠네요.

근데 문제는 타 시스템들과의 연동을 할때입니다.

내부에서 세운 규칙을 타 시스템들과 데이터를 주고 받을때다 문서로주고 받기도 번거롭고, 데이터 규칙에 대한 문서들이 많아지게 되는 문제가 있습니다.

그래서 Xml이나 Json과 같은 데이터 포맷을 정의하고 그 포맷에는 규칙도 있습니다.

아주 오래전부터 사용되었던 포맷은 Xml이겠네요

xml


좀 정신없는 그림이지만..

이렇게 태그형식을 통해서 Key와 Value를 구분하고, 태그안에 태그를 넣어서 부모와 자식관계의 구조를 나타냅니다.

저도 요즘은 Xml 포맷을 자주 접하지 않아서 보고 있으면 어지럽네요;

근데 위에 Object와 Array 부분은 표시를 해놨지만 Xml포맷상으로는 구분이 안되는 부분도 있습니다.

Json

다음은 똑같은 내용의 Json 포맷입니다.

딱 봐도 간소해 보이네요. 좀 눈에 피로가 풀리는것 같습니다. ㅎ

그리고 Object 일 경우 {} 로 감싸주고있고, Array일 경우 []로 감싸주고 있어서 구분도 되고요.

Key도 아까 Xml처러 두번 들어가지 않아서 좋네요.

근데 {}, [], "" 이런 문자들이 지금은 좀 거추장스러워 보입니다.

yaml

다음은 Yaml 입니다. 야믈이라고 보통 읽고요. yml 이라고도 씁니다.


안구정화가 되네요.

-(하이픈)을 통해서 Array임을 알수가 있습니다.

yaml을 몰라서 안쓴 사람은 있어도 한번 yaml을 쓰게되면 다른포맷은 불편하게 느껴지게 된다고 말씀드리고 싶네요.


https://www.inflearn.com/questions/16184

2. yml 설정

스프링 레거시 프로젝트에서 .xml파일들 사용
web.xml, root-context.xml(싱글톤 패턴으로 한 번만 new하는 객체 설정), servlet-context.xml(지속적으로 new하는 객체 설정)의 합본

application.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

spring:

(1) jasper

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

//스프링부트는 기본적으로 jsp를 지원하지 않기 때문에
//파일리턴 기본경로인 src/main/resources/static 말고
//새로운 경로를 설정해주고 pom.xml에 JSP 템플릿 엔진을 추가한다.
//src/main/resources/static에는 정적파일만 인식이 가능하고
//동적파일인 jsp파일은 인식할 수 없기 때문에.	
spring:
  mvc:
    view:
      //Controller가 리턴할때 앞에 붙혀주는 경로명
      prefix: /WEB-INF/views/
      //앞에 붙혀주는 경로명
      suffix: .jsp

/WEB-INF/views/ 폴더 생성(jsp파일 넣기)

@Controller //파일을 리턴할 경우
public class TempControllerTest {
	@GetMapping("/temp/home")
	public String tempHome() {
		System.out.println("tempHome()");
		//파일리턴 기본경로 : src/main/resources/static
		//리턴명 : /home.html 이라고 해야 파일 리턴 가능(앞에 / 있어야함)
		// 풀경로 : src/main/resources/static/home.html
		return "/home.html";
	}
	
	@GetMapping("/temp/jsp")
	public String tempJsp() {
		// prefix : /WEB_INF/views/
		// suffix : .jsp
		// 풀네임 : /WEB_INF/views/test.jsp
		// 리턴명 : / 없이 
		return "test";
	}
}

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

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

jpa:

  jpa:
    open-in-view: true
    hibernate:
      //자동으로 테이블 생성,수정,삭제
      //처음에만 create하고 나중에 변경할때는 update로 바꾸기
      ddl-auto: create
      naming:        
        //spring.jpa.hibernate.naming.physical-strategy : 카멜케이스 -> 스네이크 케이스로 자동 변경
        //변수명 그대로 테이블에 필드값 생성
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      //jpa가 사용하는 기본 넘버링 전략을 따라가지 않는다(false)
      //프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
      use-new-id-generator-mappings: false
    //sql 쿼리 콜솔창에 나타내기(true)
    show-sql: true
    properties:
      //콘솔창에 쿼리문 예쁘게 정렬해서 나타내기(true)
      hibernate.format_sql: true

(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를 하면 기본 넘버링 전략을 따라간다는 뜻이다.

(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는 스프링부트가 디폴트로 활성화하고 있는 옵션이다. 경고를 제거하기 위해 명확하게 적어준 것 뿐!!

(8) jackson:

      serialization:
          fail-on-empty-beans: false

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

0개의 댓글