Spring

9mond·2023년 9월 20일
0
post-thumbnail

1. Framework란?

  • '뼈대나 근간'을 이루는 코드들의 묶음
  • 프로그램의 기본 흐름이나 구조를 정하고, 이 구조에 자신의 코드를 추가하는 방식으로 개발할 수 있도록 하는 프로그래밍의 기본 틀을 의미
  • 개발에 필요한 구조가 제공되고, 여기에 필요한 부분을 조립하는 형태로 개발이 진행된다.

2. 라이브러리란?

  • 라이브러리란 자주 사용되는 조직을 재사용하기 편리하도록 잘 정리한 일련의 코드들의 집합

3. Framework vs 라이브러리

  • 프레임워크는 자동차의 프레임, 즉 기본적으로 구성하고 있는 뼈대를 말한다.
  • 라이브러리는 자동차의 기능을 하는 부품을 의미한다.
  • 한 번 정해진 자동차의 프레임은 바꿀 수 없다.
  • 소형차를 만들기 위해 뼈대를 사용하는데, 이 뼈대로 SUV를 만들 수는 없다.(Framework)
  • 그러나 바퀴나 선루프, 헤드라이트 등은 비교적 다른 종류로 쉽게 바뀔 수 있다.(라이브러리)

4. Spring이란?

  • 스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 간단히 스프링이라고도 불린다.
  • 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 있다.

5. Spring vs Spring boot

  • Spring boot는 많은 부분을 생략

6. Spring Boot 설정

6-1. Embaed Tomcat

  • 스프링 부트는 내장형 톰캣을 가지고 있기 때문에 별도의 톰캣을 설정할 필요가 없어졌으며, 그렇기 때문에 독립적으로 실행 가능한 jar로 손쉽게 배포가 가능해졌다. (서버를 내장하므로 따로 만들 필요가 없음.)

6-2. AutoConfigurator

  • 공통적으로 필요한 DispatcherServlet과 같은 설정을 어노테이션을 이용하여 대신할 수 있도록 해준다.
  • 스프링 부트의 main 메서드는 @SpringBootApplication 어노테이션을 가지고 있는데 이것은 ComponentScan + configuration + EnableAutoConfiguration을 합친 어노테이션이라고 볼 수 있다.

7. 환경설정

spring 설치

spring 검색 후 window용으로

LTS
- Long Term Support
- 오랜 기간 지원될 버전

8. 프로젝트 세팅

  • https://start.spring.io/

    이걸로 core생성 후 workspace에 압축 풀어서 저장



    GRENERATE

    core 안으로 경로설정

초기 세팅

모두 선택해서 confirm


참고



UTF-8로 다 맞춰줌(한글)

index.html(웰컴페이지)로 테스트


project 만들때 application.properties에 기본 세팅.
html파일엔 상단에 써줘야함

8-1. Project : 사용할 빌드 툴 선택 ( Maven / Gradle )

  • Maven, Gradle은 프로젝트에 필요한 의존성을 관리하고 빌드의 라이프사이클을 관리해주는 툴이다.
  • 과거에는 Maven을, 최근에는 Gradle을 사용하는 추세이다. (Maven이 훨씬 복잡하다. 신규 프로젝트, 최신 기술, 직관적 -> Gradle)

8-2. Spring Boot : 버전 선택

  • SNAPSHOT이 붙은 것은 현재 개발중인 버전, M(Minor)은 정식 릴리즈 되지 않은 버전, 아무것도 붙어있지 않은 것이 정식 릴리즈된 버전이다.

9. DispatcherServlet

  • 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다.
  • 스프링 MVC의 프론트 컨트롤러가 DispatcherServlet이다.
  • 이 DispatcherServlet이 바로 스프링 MVC의 핵심이다.
  • DispatcherServlet도 부모 클래스에서 HttpServlet을 상속 받아서 사용하고, 서블릿으로 동작한다.
  • DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet 상속

10. 프레임워크 흐름

  • 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
  • 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  • 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  • viewResolver 호출 : viewResolver를 찾고 실행한다.
  • view 반환 : viewResolver는 뷰의 논리이름을 물리이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
    -> forward, redirect
    -> 기본방식 : forward방식

11. Model이란?

  • Controller에서 데이터를 Model에 담는다. view는 Model에 담겨있는 데이터만 쏙쏙 골라서 화면에 바인딩 해준다.
  • Model 객체는 컨트롤러에서 데이터를 생성해 이를 JSP, HTML, 즉 view 단에 전달하는 역할을 한다.
  • HashMap형태를 갖고 있고, 키(key)와, 밸류(value)값을 저장한다. request.setAttribute(...)과 비슷한 역할을 한다.

12. ModelAndView

  • model 역할에서 view 영역이 좀 더 확장(포함되어 있다.)
  • Model과 view를 동시에 설정이 가능한 컨트롤러는 Model과 view가 모두 리턴 가능하다.

13. Model vs ModelAndView

  • 데이터만 저장한다 vs 데이터와 이동하고자 하는 viewPage를 같이 저장한다.

14. 계층 구조

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현
  • 레파지토리 : 데이터베이스에 접근
  • 도메인 : 비즈니스 별 도메인 객체 ex) 회원, 주문, 쿠폰 등등

💻코드

application.properties

 #port 세팅
server.port=9090

#한글설정
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

#thymleaf cache
spring.thymeleaf.cache=false

static

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	Hello
	<a href="/hello">hello</a>
</body>
</html>

Controller

HelloController.java

package com.codingbox.core.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/*
 *  @Controller : Controller 역할을 하는 class에 붙여준다.
 *  		해당 Controller에서 mapping url을 찾는다.
 *  		현재 : localhost:9090/hello
 */
@Controller
public class HelloController {
	
	/*
	 * @GetMapping : get방식의 요청
	 */
	@GetMapping("/hello")
	public String hello(Model model) {
		System.out.println("hello 도착");
		model.addAttribute("data", "hello!!!");
		return "hello";	// hello.html 화면을 찾아서 return
		/*
		 * 컨트롤러에서 리턴 값으로 문자를 반환하면 veiwResolver가 화면을 찾아서 처리한다.
		 *  - 스프링 부트 템플릿엔진 기본 viewName 매핑
		 *  - resources:templates/+{viewName}+.html
		 */
	}
	
	/*
	 * @RequestParam("name")
	 *  -> request.getParameter("name")와 동일하다.
	 *  **옵션**
	 *  required : 파라미터 값 필수 여부, true -> 필수(default), false -> 필수 아님
	 *  defaultValue : 파라미터 값이 없을 경우 기본으로 들어갈 값
	 *  
	 */
	// http://localhost:9090/hello-mvc?name=Spring
	@GetMapping("hello-mvc")
	public String helloMvc(@RequestParam(value="name", required=false, defaultValue="required test") String username, Model model){
		model.addAttribute("modelvalue", username);
		return "hello-template";
	}
	
}

MemberController.java

package com.codingbox.core.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.codingbox.core.dto.MemberDTO;

@Controller
public class MemberController {
	
	@RequestMapping("member")
	public String getMember(Model model) {
		MemberDTO member = new MemberDTO(1, "자바학생", "01012345678");
		model.addAttribute("member", member);
		return "thymleaf/member";
		
	}
}

templates

hello.html

- <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p th:text="'타임리프 ' + ${data}">안녕하세요. 손님</p>
	
</body>
</html>

hello-template.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p th:text="'hello not empty ' + ${modelvalue}">empty!!</p>
</body>
</html>

dto

MemberDTO.java

package com.codingbox.core.dto;

public class MemberDTO {
	
	private int no;
	private String name;
	private String phone;
	
	
	
	public MemberDTO(int no, String name, String phone) {
		super();
		this.no = no;
		this.name = name;
		this.phone = phone;
	}
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
}

templates.thymleaf

member.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table border="1">
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>전화번호</th>
		</tr>
		<tr th:object="${member}">
			<td><span th:text="*{no}"></span></td>
			<td><span th:text="*{name}"></span></td>
			<td><span th:text="*{phone}"></span></td>
		</tr>
		
	</table>
</body>
</html>
profile
개발자

0개의 댓글