2022.11.26 yaml 설정
Xml과 Json 파일 포맷은 많이 들어보셨는지요?
아마 많이 쓰고 계실 걸로 생각 됩니다. 그럼 이런 포맷들은 왜 사용할까요?
그걸 먼저 설명드리면,
우리가 타 시스템 간에 데이터를 주고 받을 때 데이터 포맷에 대한 약속이 필요합니다.
혼자 시스템을 개발하거나 내부 시스템 끼리는 "1-김태민-강사,2-아무개-학생" 이라는 문자열을 만들어서 "-(하이픈)"을 파싱해서 순서대로 "1"은 일련번호, "김태민"은 이름, "강사"는 구분이라는 규칙과, ",(콤마)"는 리스트를 나타내는 구분자라는 규칙을 세울 수 있을 겁니다.
그럼 데이터를 내부 시스템에 전송할때 포맷에 대한 형태는 말로써 혹은 내부 문서로써 정의해 놓으면 되기 때문에 데이터 크기는 엄청 작아 질 수 있겠네요.
근데 문제는 타 시스템들과의 연동을 할때입니다.
내부에서 세운 규칙을 타 시스템들과 데이터를 주고 받을때다 문서로주고 받기도 번거롭고, 데이터 규칙에 대한 문서들이 많아지게 되는 문제가 있습니다.
그래서 Xml이나 Json과 같은 데이터 포맷을 정의하고 그 포맷에는 규칙도 있습니다.
아주 오래전부터 사용되었던 포맷은 Xml이겠네요
좀 정신없는 그림이지만..
이렇게 태그형식을 통해서 Key와 Value를 구분하고, 태그안에 태그를 넣어서 부모와 자식관계의 구조를 나타냅니다.
저도 요즘은 Xml 포맷을 자주 접하지 않아서 보고 있으면 어지럽네요;
근데 위에 Object와 Array 부분은 표시를 해놨지만 Xml포맷상으로는 구분이 안되는 부분도 있습니다.
다음은 똑같은 내용의 Json 포맷입니다.
딱 봐도 간소해 보이네요. 좀 눈에 피로가 풀리는것 같습니다. ㅎ
그리고 Object 일 경우 {} 로 감싸주고있고, Array일 경우 []로 감싸주고 있어서 구분도 되고요.
Key도 아까 Xml처러 두번 들어가지 않아서 좋네요.
근데 {}, [], "" 이런 문자들이 지금은 좀 거추장스러워 보입니다.
다음은 Yaml 입니다. 야믈이라고 보통 읽고요. yml 이라고도 씁니다.
안구정화가 되네요.
-(하이픈)을 통해서 Array임을 알수가 있습니다.
yaml을 몰라서 안쓴 사람은 있어도 한번 yaml을 쓰게되면 다른포맷은 불편하게 느껴지게 된다고 말씀드리고 싶네요.
https://www.inflearn.com/questions/16184
스프링 레거시 프로젝트에서 .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
.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";
}
}
datasource 의 mysql 드라이버에 cj가 들어간 이유는 mysql 6점대 이상 버전부터는 해당 드라이버를 사용하고 그 이전 드라이버는 cj가 없는 com.mysql.jdbc.Driver를 사용한다.
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
create - 서버 시작시마다 DB초기화
update - 수정사항만 DB에 반영
none - DB에 아무런 반영을 하지 않음.
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
엔티티를 만들 때 변수명 그대로 DB에 필드를 만들어 준다.
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
엔티티를 만들 때 변수명에 언더스코어를 붙여준다. 예) createDate -> create_date
use-new-id-generator-mappings 는 mysql로 말하면 auto_increment 오라클로 말하면 시퀀스를 어떤식으로 사용할지 방식을 결정하는 것인데 false를 하면 jpa가 사용하는 기본 넘버링 전략을 따라가지 않는다는 뜻이고 true를 하면 기본 넘버링 전략을 따라간다는 뜻이다.
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는 스프링부트가 디폴트로 활성화하고 있는 옵션이다. 경고를 제거하기 위해 명확하게 적어준 것 뿐!!
serialization:
fail-on-empty-beans: false
Lazy-loading으로 인해 empty-beans이 생길 수 있다. 너그럽게 빈 객체를 허락해주는 옵션이다.