Wanna be Brilliant Full-Stack Developer

SpringBoot Blog 만들기 Lombok 세팅하기 과 YML 설정하기 본문

Back-End/블로그 만들기 With SpringBoot

SpringBoot Blog 만들기 Lombok 세팅하기 과 YML 설정하기

Flashpacker 2023. 2. 15. 17:36


.m2에는 Maven 이 관리하는 라이브러리가 있다.

특정하게 어디서 다운로드를받아서 넣는것이 아니라 pom.xml에 기술만 하면 자동으로 다운이 된다.

저 Jar을 실행할것인데 이 실행을 해서 내 툴이 인식을 하도록 해야한다.

깃 배쉬를 통해서 lombok 실행할 위치를 STS 실행파일로 설정을 해야한다

그리고 Member.java에서 생성자와 게터와 세터를 지우고

 어노테이션 으로 Getter와 Setter을 동시에 가져오기 위해서는?

@Data라는것을 임포트 하면 된다.

@AllArgsConstructor 모든 필드를 다쓰는 생성자를 만들고 싶으면? 이것을 임포트 하면된다.

 

package com.cos.blog.test;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

//@Getter
//@Setter
@Data
//@AllArgsConstructor
public class Member {
	private final int id;
	private final String username;
	private final String password;
	private final String email;
}

한번쓰고 어차피 데이터베이스에 있는 값을 집어넣는 것이기 떄문에 데이터가 변경되지 않도록

final로 잡아놓는다. 왜그렇게 하는가? 불변성을 유지하기 위해서이다.

데이터베이스에 들고온 값을 변경할 일이 없기 떄문이다.

변경할 일이 있다고 하면 final을 붙이면 안된다. 

@RequiredArgsConstructor 을 하면 final을 붙인 애들에 대한 생성자를 만들어준다.

 

@AllArgsConstructor : 전체 생성자 
@NoArgsConstructor : 빈생성자

package com.cos.blog.test;

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.service.annotation.PutExchange;

// 사용자가 요청 -> 응답(HTML 파일)
// @Controller

// 사용자가 요청 -> 응답(Data)

@RestController
public class HttpControllerTest {
	
	private static final String TAG = "HttpControllerTest :";
	
	@GetMapping("/http/lombok")
	public String lombkTest() {
		Member m = new Member(1, "ssar", "1234", "email");
		System.out.println(TAG + "getter : " +m.getId());
		m.setId(5000);
		System.out.println(TAG + "setter : "+m.getId() );
		return "lombok test 완료";
	}
	
	
	//인터넷 브라우저 요청은 무조건 get요청밖에 할 수 없다.
	//http://localhost:8080/http/get (select)
	@GetMapping("/http/get")
	public String getTest(Member m) { //?id=1&username=ssar&password=1234&email=ssar@nate.com
		return "get 요청 : "+m.getId()+"," + m.getUsername() +"," +m.getPassword() +"," +m.getEmail();
	}
	
	//http://localhost:8080/http/post (insert) 
	@PostMapping("/http/post") //text/plain
	public String postTest(@RequestBody Member m) { //MessageConverter (스프링부트) 
	
		return "post 요청 : "+m.getId()+"," + m.getUsername() +"," +m.getPassword() +"," +m.getEmail();
	}
	
	//http://localhost:8080/http/put (update)
	@PutMapping("/http/put")
	public String putTest(@RequestBody Member m) {
		return "put 요청 : "+m.getId()+"," + m.getUsername() +"," +m.getPassword() +"," +m.getEmail();
	}
	
	//http://localhost:8080/http/delete (delete) 
	@DeleteMapping("/http/delete")
	public String deleteTest() {
		return "delete 요청";
	}
}

lombok을 통해서 또다른것을 할 수 있다. 

@Builder 

내가 객체를 만들고 싶은데 이 값은 자동으로 증가하는 시퀀스 역할을 하고 싶으면

내가 넣어주는것이 아니라 데이터베이스에 넣어주는것이니까 

또 다른 생성자를 만들어야한다.

	@GetMapping("/http/lombok")
	public String lombkTest() {
		Member m = Member.builder().username("ssar").password("1234").email("ssar@nate.com").build();
		System.out.println(TAG + "getter : " +m.getUsername());
		m.setId(5000);
		System.out.println(TAG + "setter : "+m.getId() );
		return "lombok test 완료";
	}

builder 패턴을 쓰면 순서를 안지켜도 필드의 어떤 값이 들어갈지 몰라도 상관없다.

내가 생성자를 통해서 넣을때는 무조건 아이디, 유저네임, 패스워드 순서를 다 지켜야하고 틀리면 망한다.

 


YML이란? 스프링 프로젝트를 설정한다는것이다

포트나 데이터베이스 연결 및 인코딩과 같은 전반적인 설정을 yml파일에대가 한다.

기존에는 xml파일에다 했지만 yml파일에다가 한다.

 

xml파일이라는것은 데이터의 크기가 조금 크다.

JSON이라는 파일을 보면 닫히는 태그가 없기 때문에  xml파일보다는 조금더 경량 데이터이다.

JSON보다 조금더 경량 데이터를 표현하기 위해서는 Yaml파일로 만들면 된다. 

키 값에 쌍 타옴표가 없고 그리고 value값에는 규칙이 하나 있다.

키와 value 값 사이에는 스페이스 하나가 띄어져 있어야한다.

엄청 강력한 규칙이다.

yaml 파일은 중괄호가 없이 밑으로 내려와서 스페이스 두칸이다.

스페이스 두칸을 지키지 않으면 이 파일이 존재 하지 않는다.

중괄호가 없기 떄문에 Json파일 보다 yaml파일이 훨씬더 가볍다.

스프링은 yaml파일로 모든 설정을 한다. 

 

Yml 설정을 하기전에

스프링 레거시를 했던 사람들은 web.xml 과 root.context.xml 과 servlet-context.xml의 합본이

application.yml이다.

 root.context.xml 은 한번만 new되고 더이상 new될 필요가 없는 애들.

싱글톤으로 관리할 수있는 애들, 객체가 하나만있으면 되는 애들은 root.context.xml에서 관리하고

메모리에서 new를 하게된다.

Servlet-context.xml은 한번만 new가 아니라 지속적으로 new해서 만들어서 사용해야 하는 애들을

servlet-conetext에서 관리한다.

 

근데 스프링에서는 재네들을 건드리지 않는다. 

스프링에서는 application.yml 파일에 설정만 하면 된다.

스프링부트는  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

스프링에 진입하기 직전에 이 application.yml 파일을 읽고 시작한다. 

이 파일을 다 분석할 필요가 있다.

JPA라고 적혀있는 부분은 지금 이해하기가 굉장히 어렵다.

 

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

이걸 설명하기 전에 스프링부트의 작동원리에 대한 이해가 필요하다.

@Controller을 만들것인데 왜냐하면 우리는 데이터를 리턴하는것이 아니라 파일을 리턴하기 떄문에

파일을 리턴할때 컨트롤러라는 어노테이션이 붙을때는 이 메서드는 파일을 리턴한다.

어떤 파일을 리턴하는가? 

파일리턴 기본 경로가

package com.cos.blog.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TempControllerTest {

	//http:/localhost:8000/blog/temp/home
	@GetMapping("/temp/home")
	public String tempHome() {
		System.out.println("tempHome()");
		//파일리턴 기본경로 : src/main/resources/static
		return "home.html";
	}
}

//파일리턴 기본경로 : src/main/resources/static 이 경로에 있는 

return "home.html"; 이 파일을 리턴 하라는건데 찾아지지 않는다.

어떻게 하면 리턴할 수 있는가? 

리턴명을 /home.html이라고 해야 뜬다.

풀경로가 : src/main/resources/static/home.html이라고 하면 뜰것이다.

 

우리는 템플릿 엔진을 html이 아니라 jsp파일을 리턴할것이다.

스프링부트는 jsp를 기본적으로 지원하지 않는다.

첫번째로 그래서 필요한것은 pom.xml에 JSP 템플릿 엔진을 의존성 설정을 해줘야한다.

그래야지 JSP가 작동이 된다.

기본경로가 static이기 때문에 static파일에 JSP를 넣어놓으면 제대로 작동이 안된다.

static파일에는 정적 파일만 보관하는 경로이다.

static이하에는 브라우저가 인식할 수 있는 파일만 놔야한다.

브라우저가 인식할 수있는 파일을 정적파일이라고 한다.

package com.cos.blog.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class TempControllerTest {

	//http:/localhost:8000/blog/temp/home
	@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/img")
	public String tempImg() {
		return "/a.png";
	}
	
	@GetMapping("/temp/jsp")
	public String tempJsp() {
		return "/test.jsp";
	}
	
}

JSP파일을 넣어도되는가? 찾아는 주는데 무슨 문제가 있는가? 

못찾는다 왜 못찾는가? 

JSP만 못찾는다. 왜냐하면 JSP는 정적인 파일이 아니라 동적인 파일 자바 파일이기 떄문이다.

컴파일이 일어나는 파일인데 브라우저가 애를 인식 하지 못한다.

그리하여 경로를 바꿔야한다. 

main이라는 폴더가 있다.

그곳에 folder을 

 

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

여기서 prefix는 무엇인가하면 컨트롤러가 리턴을 할떄 앞에 붙여주는 경로명이다. 

suffix는 뒤에 붙여주는 경로명이다. 

이제부터는 동작을 어떻게 하는가?

@GetMapping("/temp/jsp")
public String tempJsp() {

return "/test.jsp";

 

return "/test.jsp";이거가 리턴이 될텐데 

리턴 양값으로 prefix: /WEB-INF/views/
   suffix: .jsp 이 붙는다. 

풀네임은 /WEB-INF/views/test.jsp

컴파일이 되어서 나왔다. 톰캣이 이 파일은 jsp파일이니까 java파일이니까 Web서버에 아파치에게 니가 할 수 있는 일이 아니니까 톰캣인 내가 이 해당파일을 컴파일 해서 html로 던져줄게 그러면 브라우저가 이해할수있을거야 라고 처리 되는것이다. 

 


스프링부트는 application.yml 파일에 설정하면 된다.
@RestController는 문자 그 자체를 return 하는 반면,
@Controller는 해당 경로 이하에 있는 파일을 리턴하므로 슬러시(/)를 붙여야 한다.
스프링부트는 기본적으로 jsp 지원을 하지 않는다.
jsp파일을 리턴해줘도 정상적으로 동작하지 않는다. 스프링부트에서 jsp를 인식하기 위한 사전설정은 다음과 같다.

1. pom.xml에 JSP 템플릿 엔진 dependency 추가
<!-- JSP 템플릿 엔진 -->
<dependency> <groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>

</dependency>


2. application.yml에 다음 코드를 추가한다.
spring:

  mvc:

    view:

      prefix: /WEB-INF/views/

        suffix: .jsp


src/main/webapp/WEB-INF/views 디렉토리를 직접 만들어야 한다.

이때 뒤에 확장자명이 이미 설정파일에 추가되어 있으므로 파일이름만을 return한다.
EX) return "temp";
JSP파일은 정적 파일이 아니므로 웹서버인 아파치가 처리하지 못한다. 톰캣이 대신 컴파일해서 웹브라우저에게 전달한다.