국비교육(22-23)

58일차(2)/Spring Boot(3) : Spring web project 세팅 / Spring Boot 설정 작성법

서리/Seori 2022. 12. 29. 23:02

58일차(2)/Spring Boot(3) : Spring web project 세팅 / Spring Boot 설정 작성법

 

 

 

1) 처음에 만든 java web project

2) Spring 에서 사용하는 project

3) Spring Boot project

 

- boot로 오면서 웹 프로젝트에도 많은 변화가 생겼다

- Spring boot는 아예 jsp 파일을 안 만드는 쪽으로 가려고 한다.

- html 템플릿에 데이터를 바인딩해서 출력한다.

 

- 우리는 일단 레거시 프로젝트에 형태를 맞춰서 만들어볼 예정!

 

 

- 타입/자바 버전은 maven/8을 가장 많이 쓴다.

 

- 유행은 장기적으로 gradle 로 가고 있다. /  java 버전 11정도!

 (그렇지만 버전이 너무 올라가도 오류가 많이 날 수 있다)

 

- 일반 웹 프로젝트도 spring 방식으로 개발할 수 있다.

- 지금처럼 그냥 만들면 웹 프로젝트는 아님.

- spring이 무조건 웹프로젝트인 것은 아니다.(물론 대부분 web project를 만들기는 한다)

 

- 의존관계를 느슨하게 해서 개발하는 도구가 스프링만 있는 것은 아니다.

 

- spring으로 일반 java 프로젝트 / 안드로이드 앱도 만들 수 있다.

 

 

- 프로젝트명+Application.java 가 있고, 이 안에 Main클래스가 있다.

- run하면 여기서부터 실행이 들어간다.

 

 

- JavaConfig 클래스에 Car 타입의 객체를 bean으로 관리하도록 해두었다.

- 이 문서와 자바 프로젝트가 비슷한 것

 

* Spring

- bean설정을 xml로 했다. 어떤객체를 spring bean container에서 관리할지!

- xml 안의 bean 설정으로 대신한다.

 

* Spring Boot

- xml이 아닌 Java Class에서 bean을 관리한다.

- @Configuration이 붙은 java 클래스 안에 들어있는 메소드로 대신한다.

 

 

- xml문서 : html로 어떤 객체를 생성해서 어떤 이름으로 사용할지 명시

 

- class에서는? 어떤 객체를 리턴하고 어떤 이름으로 사용할지 메소드로 적어준다.

- 메소드명이 이름이 된다.

 

- method의 이름이 bean의 이름 역할을 한다.

 

- bean을 붙여놓으면 spring이 알아서 객체를 호출해서 가지고 있다가

 autowired 되는 곳에(필요한 곳에) 자동으로 집어넣어 준다.

 

 

 

- xml문서의 bean 설정은 @Configuration 이 있는 java 클래스의 메소드로 대신한다.

- 이 메소드의 이름이 bean 의 이름 역할을 한다.

- 여기서 리턴하는 객체의 참조값을 어떻게 얻어낼지는 우리가 정하면 된다.(초록색 영역 안에서 코딩)

 

 

- 메인 클래스에서 ApplicationContext 객체를 리턴해주는데,

 autowired 하지 않고 getBean 이라는 방식으로 참조값을 얻어낼 수도 있다.

- 이렇게 Bean으로 만들 수도 있다.

 

 

- Spring Boot App 으로 run하기!

 

- 아주 잠깐 이 위치에 실행순서가 들어오고 끝난다.

- 어플리케이션의 실행이 계속 지속되는 것은 아니다.

 

- 이것을 디버깅모드에서 확인할 수 있다.

- 돌고 있는 프로세스가 있으면 여기서 중단시킬 수 있다.

- 하지만 boot앱은 잠깐 실행되고 바로 끝난다(terminate 된다)

- java에서 run 하듯이 잠깐 실행되고 마는 것!

 

 


 

- hello2 프로젝트

 

- JavaConfig에서 MyCar객체를 관리하게 하고 있음.

 

- MyCar객체 관리, getBean을 통해서 사용!

 

- 이것은 xml을 사용하는 예전 방식.

- resources에 config.xml을 만들어 놓기. 어떤클래스를 객체로 생성해서 관리할지 정해놓는다.

- 여기서 객체의 참조값을 얻어와서 관리한다.

 


 

- 웹서버가 돌아가는 spring boot 프로젝트 만들어보기!

 

Boot03_Controller 프로젝트 생성

 

- name, group, package명 수정

 

 

- 버전 2.7.8 / devtools, spring web 이렇게 2개를 선택해주기

- 체크하면 의존 dependency에 저것을 대신 만들어준다. pom.xml을 대신 작성해주는 것 !

 

- 버전은 2점대를 현재 가잗 많이 쓴다.

 

 

메인메소드

package com.sy.boot03;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/*
 * Spring Boot Web은 내장된 tomcat 서버가 있다.
 * 그래서 따로 tomcat 서버를 잡을 필요가 없다. 
 */
@SpringBootApplication
public class Boot03ControllerApplication {

	public static void main(String[] args) {
		SpringApplication.run(Boot03ControllerApplication.class, args);
	}

}

 

- 웹 프로젝트여도 메인 클래스/메소드가 똑같이 있다.

 

- Spring Boot Web은 내장된 tomcat 서버가 있다. 그래서 따로 tomcat 서버를 잡을 필요가 없다.

- 편리하지만 이미 설정이 되어있으면 개발자가 마음대로 세팅하기가 어렵다는 단점도 있다.

 

- run해보면 START에 실패하면서 8080 포트가 이미 사용되고 있다고 나온다.

- 이럴때는 포트 번호를 바꿔야 한다...

- 어떤 설정이 밖에 있으면 고치기가 쉬운데, Spring Boot에서는 프로젝트 어딘가에 숨어있다.

 

- application.properties 여기에 설정하면 된다.

 

- 들어가서 server를 입력해보면 자동완성으로 뭔가 문서 구조가 나온다.

 

- 일단은 텍스트 문서인데 xml도 json도 아니고, 그냥 xx = yy 형태로 작성하는 텍스트 문서이다.

 

- 이렇게만 입력해주면 세팅이 된다.

 

 

- 다시 run-Spring Boot App을 해보면 잠깐 실행되고 끝나는 것이 아니라, 쭉 실행되고 있는 상태인 것을 볼 수 있다.

- 서버가 켜져서 프로젝트의 실행이 살아있는 상태!

 

- 현재 페이지는 없지만 context path 요청에 대해 뭔가 응답은 하고 있다.

 

 

- resources에 static이라는 폴더가 있다.

- 기존 webapp/resources 폴더와 비슷하다. 정적인 자원들을 넣어놓는 공간이다.

 

 

 

- New-other에서 html파일 생성. index.html 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/static/index.html</title>
</head>
<body>
	<div class="container">
		<h1>인덱스 페이지 입니다.</h1>
		<ul>
			<li><a href="hello">hello boot!</a></li>
			<li><a href="hello2">hello2 boot!</a></li>
			<li><a href="hello3">hello3 boot!</a></li>
		</ul>
	</div>
</body>
</html>

 

- 페이지를 만들어놓으면 이렇게 나온다

 

- spring에서 쓰던 Resources 폴더와의 차이는?

→ static 폴더 안에 jsp 파일을 만들언 넣으면 동작하지 않는다.

   정적인 자원, html, css, javascript 등 만 넣을 수 있다.

 

- DispatcherServlet도 있다. 페이지를 동작하게 하려면 controller만 만들면 된다!

 

 

HelloController

package com.sy.boot03;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	
	@ResponseBody
	@RequestMapping("/hello")
	public String hello() {
		return "hello";
	}
}

 

 

 

- views에 페이지를 만들어야 할 것 같은데, webapp 폴더가 없다...!

- spring boot는 jsp를 싫어해서 없다..

- 나중에는 webapp, WEB-INF 폴더를 직접 만들어서 사용한다.

 

- 그러면 뷰 페이지 응답은 어떻게 할지?

 

 

- @ResponseBody 를 사용해서 바로 문자열로 응답하기. 문자열을 그대로 응답시킬 수 있다.

- 페이지 소스 보기로 보면 그냥 hello 라는 문자열 하나만 날아와 있다.

 


 

- hello2 요청

 

다른 컨트롤러에서 처리해보기

HelloController2

package com.sy.boot03;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController2 {

	// GET 방식 /hello2 요청을 해오면 "hello2" 라는 문자열이 바로 응답된다.(@ResponseBody 효과)
	@RequestMapping(method = RequestMethod.GET, value="/hello2")
	public String hello2() {
		return "hello2";
	}
	//위의 맵핑 방식을 좀더 간단히 할 수 있다.
	@GetMapping("/hello3")
	public String hello3() {
		return "hello3";
	}
}

 

- @RestController 를 붙여준다.

 

- Maven Dependencies 를 보면

 

 

- Spring이 5.xx 버전으로 들어있다. tomcat 서버는 9.xx 가 들어있다.(내장)

 

 

 

- @Responsebody가 기본인 컨트롤러가 @RestController 이다.

- GET 방식 /hello2 요청을 해오면 "hello2" 라는 문자열이 바로 응답된다.(@ResponseBody 효과)

 

- REST API 라는 것이 있다. 이것을 만들다 보면 컨트롤러에서 직접 응답할 일이 종종 있다.

- 그럴 때 (java 5.xx대에) 기본으로 있는 @RestController 어노테이션을 사용하면 된다.

 응답의 기본이 ResponseBody 인 것!!

 

- 더 편하게 작성하기 위해서 사용한다.

 

- @GetMapping 과 표시한 부분은 같은 의미이다. Get방식 요청을 RequestMapping 하는 것!

- @PostMapping 도 있다.

 

-  컨트롤러에서 파라미터 추출하기 이런 것은 모두 같다!

- modelAndView 등의 사용법도 같다.

 

 

 

- pom.xml을 보면 스타터 웹, 개발툴, 테스트 디펜던시 등이 있다.

 

 

- Boot는 2점대중 최신버전을 사용.

- Spring3에서는 java 버전 6점대를 쓴다. Spring2에서는 5점대 사용!

 

 

- Application.properties 파일을 원활히 사용하기위해 추가설치하기

- Help-Install new Software에서 문자열 직접 등록: http://propedit.sourceforge.jp/eclipse/updates/

 

- 지금은 한글을 사용할 수 없는데(자동 유니코드 변환), 설치되면 이것을 사용해서 한글을 쓸 수 있다.

 (근데 불편한 부분도 있으므로 굳이 설치하지는 않아도 된다.)

 

- 이렇게 추가!

- 지금은 localhost:9000/index.html 로 사용하는데, 

 

 

- 이렇게 컨텍스트 경로가 있게 하려면 위와 같이 작성해준다.

 

- 이제 /boot03 에 대해 index가 응답된다.

 

 

- 나중에는 이렇게 쓰지 않는다. application.yml 파일을 사용!