[Springboot] Springboot 입문

DI 객체를 사용하는 2가지 방법.

20210622_131332

왼쪽에서 A는 BC의 기능을 사용한다고 볼 수 있지만 B,C의 기능에 의존한다고 볼 수도 있다.

20210622_131837

스프링은 객체를 생성,라이프 사이클 관리 및 필요로 하는 객체에 의존 주입을 하는 라이브러리 집합체라 할 수 있다.

이 컨테이너의 역할은 개발자가 직접 제어하지 않고 객체의 제어성이 넘어갔다는 의미로 제어의 역전이라 한다.

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 폴더 아래 둔다.

20210622_160134

<!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 복사
    • 필요 없는 내용 지우기





© 2021.03. by yacho

Powered by github