[Springboot] Springboot 입문
in Study on Springboot
DI 객체를 사용하는 2가지 방법.
왼쪽에서 A는 BC의 기능을 사용한다고 볼 수 있지만 B,C의 기능에 의존한다고 볼 수도 있다.
스프링은 객체를 생성,라이프 사이클 관리 및 필요로 하는 객체에 의존 주입을 하는 라이브러리 집합체라 할 수 있다.
이 컨테이너의 역할은 개발자가 직접 제어하지 않고 객체의 제어성이 넘어갔다는 의미로 제어의 역전이라 한다.
import java.util.Date;
public class UnderstandDI {
public static void main(String[] args) {
//날짜를 구하기 위해서는 Date 클래스에 의존해야 한다.
Date date = new Date();
System.out.println(date);
}
public static void getDate(Date d) {
Date date=d;
System.out.println(date);
}
private static void memberUse1() {
//강한 결합 : 직접 생성
Member m1 = new Member();
}
private static void memberUse2(Member m) {
//약한 결합: 생성된 것을 주입 받음 - 의존 주입(Dependency Injection)
Member m2 = m;
}
}
//Member를 사용한다 = 기능에 의존한다는 소리.
class Member{
String name;
String nickname;
public Member() {}
}
약한 결합은 다른 클래스의 변화에 안전하게 대처 가능.
스프링 부트 의존 주입
- 자바 코드를 이용한 의존 주입(필요한 경우에만)
- 어노테이션을 이용한 의존주입
@SpringBootApplication 의 세가지 기능
- @Configuration
- 자바 코드로 작성된 클래스를 설정 파일이라 지정
- @EnableAutoConfiguration
- 스프링 어플리케이션 컨텍스트(Application Context)를 만들 때 지정해 둔 설정값들을 이용하여 자동으로 설정하는 기능을 켬.
- @ComponentScan
- 지정한 위치 이하에 있는 @Component와 @Configuration이 붙은 class를 스캔해서 Bean으로 등록
- @Configuration
- 클래스를 스프링 설정으로 사용함을 의미
- @Bean
- 메서드의 리턴값을 빈 객체로 사용함을 의미.
스프링 부트가 지원하는 뷰
FreeMarker Groovy Thymeleaf
프로젝트 생성시 디펜던시를 추가했다면 추가적인 설정 없이 템플리 ㅅ폴더 아래에 확장자 html 파일을 만들어 사용할 수 있다.
파일의 내용은 html과 유사하지만 마치 jsp 처럼 작동한다. <- 이떄 부터 html파일은 정적인 파일이 아니고 동적으로 컨텐츠를 표현하는 파일이 된다.
velocity
jsp
- 추가적인 설정을 해야 사용이 가능하다. 기본적으로는 지원되지 않는다.
js, image,css 등 정적인 요소는 static 폴더 아래 둔다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World <br>
안녕하세요 <br>
<img src=/image/SpringBoot.png />
</body>
</html>
스프링 부트 내장 WAS
jsp는 스프링 부트 내장이 아님.
- tomcat, jetty, undertow
- undertow는 톰캣보다 훨씬 빠르고 안정적인 모습 보여줌.
package com.study.springboot;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping("/")
public @ResponseBody String root() throws Exception{
return "Model & View";
}
@RequestMapping("/test1")
public String test1(Model model) {
// Model 객체를 이용해서, view로 Data 전달
// 데이터만 설정이 가능
model.addAttribute("name", "홍길동");
return "test1";
}
@RequestMapping("/mv")
public ModelAndView test2() {
// 데이터와 뷰를 동시에 설정이 가능
ModelAndView mv = new ModelAndView();
List<String> list = new ArrayList<>();
list.add("test1");
list.add("test2");
list.add("test3");
mv.addObject("lists", list); // jstl로 호출
mv.addObject("ObjectTest", "테스트입니다."); // jstl로 호출
mv.addObject("name", "홍길동"); // jstl로 호출
mv.setViewName("view/myView");
return mv;
}
}
package com.study.springboot;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
//지역변수라 메서드 종료되면 메모리에서 사라짐.
//힙에 객체 생성되고 스택에 그 객체 위치 저장한 참조 뵨슈거 샹송ㄷ함
Map<String, String> model = new HashMap<>();
//리퀘스트 매핑 정보에 따라 메서드 호출
String sReturn = root(model);
//리턴 받은 뷰 페이지 이름과 ㄱ모델 객체 출력을 위해 다시 넘김
printData(sReturn, model);
}
//파라미터 모델은 힙 영역에 생성된 객체를 참조하기 위한 또다른 참조 변수
//명(이름-임금, 부모, 스승),, 자(존중-선배,친구)호(별명)
//이순신: 호 :덕암, 자:여해, 이름:순신, 군호:덕풍부원군, 시호: 충무공
public static String root(Map model) {
model.put("name1", "홍길동");
model.put("name2", "으아아");
return "hello";
}
public static void printData(String s, Map model) {
String str1 = (String) model.get("name1");
System.out.println(str1);
System.out.println("/WEB-INF/views/"+s+".jsp");
}
}
스프링 부트 프로젝트 기본형 만들기
프로젝트 생성 후
- build.gradle 수정
- jsp 디펜던시 추가
- 톰캣 버전 수정
프로젝트 제목 선택 -> 우클릭(팝업메뉴) -> gradle->refresh gradle 프로젝트
- application.properties수정
- 포트 번호 변경
- jsp 설정
- db 설정
- 폴더구성(복사 후 제거)
- 필요 없는 폴더, jsp 파일 지우기
- MyController 복사
- 필요 없는 내용 지우기