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 파일을 사용!
'국비교육(22-23)' 카테고리의 다른 글
59일차(1)/Spring Boot(5) : Boot에서 jsp 사용하기 (0) | 2022.12.30 |
---|---|
58일차(3)/Spring Boot(4) : Boot 에서 DB연동, MyBatis 사용 (0) | 2022.12.29 |
58일차(1)/Spring(22) : 갤러리 게시판 구현 (1) | 2022.12.29 |
57일차(2)/Spring(21) : Transaction, DataAccessException 활용 예제 (1) | 2022.12.28 |
57일차(1)/Spring(20) : 게시판 댓글 기능 코드 리뷰 (0) | 2022.12.27 |