포스코DX X 비트교육센터 6기 - Spring


프레임워크

틀에 맞추어 개발을 하는 것.

어플리케이션 프레임워크

  • java applicaton framwork : 자바 객체들의 의존성을 해결해주는 기능이 있는 것. - dependency injection(DI Container)
  • ex. Spring 프레임워크 : 컨테이너!!!
  • 특정 기술을 도와주는 것은 아님.
  • 관심의 분리와 같이 반복적인 일의 틀을 제공해줌.

  • **** 스프링 자체는 컨테이너다. 컨테이너 안에서 관리하는 차원에서 제어가 역전됐다는 표현을 쓰고, 생성해서 의존성을 주입하는 일들을 컨테이너 안에서 이루어진다.

그래서 이걸 어플리케이션이라고 하고, 어플리케이션 context라고도 한다.

  • 스프링 MVC? ActionFactory + Action 이 다 객체였는데, 이게 다 컨테이너 안에서 만들어진다. 실제적인 컨트롤러, 레파지토리가 action을 통해 실행되는데, 이것도 컨테이너 안에.

*** Spring = Application Famework = apllication context = IOC/DI Container

EJB

image

Spring 구성

image

Spring의 주요 전략

image

image

  • POJO란? POJO(Plain Old Java Object)는 간단하게 말해 “평범한 옛날 자바 객체”를 나타내는 용어. Java 프로그래밍에서 특정한 규칙이나 프레임워크에 의존하지 않는 간단한 Java 클래스를 의미.

  • AOP란? container가 지원해주는데, Aspect 관점(concern 핵심 관심) - AOP(Aspect-Oriented Programming)은 프로그래밍에서 다양한 관심사(Concerns)를 모듈화하고 분리하는 기술. 이를 간단하게 설명하면, 코드의 여러 부분에서 반복적으로 발생하는 특정한 작업들을 한 곳에 모아서 관리하고, 기존 코드에 영향을 미치지 않고 해당 작업을 추가하거나 제거할 수 있게 해주는 개념.

image

실습

image

  • src 지우기

  • image

-image

  • pom.xml 내용 추가
    • mvc 라이브러리 추가
    • web 라이브러리 추가 (없어도 됨. 명시를 한거임.)
    • context 라이브러리 추가가 (없어도 됨. 명시를 한거임.)
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.poscodx</groupId>
		<artifactId>spring-practices</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>hellospring</artifactId>
	<packaging>war</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
		<maven.compiler.source>17</maven.compiler.source>
		<maven.compiler.target>17</maven.compiler.target>
		<org-springframework-version>5.3.25</org-springframework-version>
	</properties>

	<dependencies>
		<!-- spring context(web framework) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>
		
		
		<!-- spring web(web framework) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>

		<!-- spring mvc(web framework) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org-springframework-version}</version>
		</dependency>


		<!-- servlet-->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.2</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>hellospring</finalName>
	</build>
</project>
  • maven update
  • java EE 와 tomcat 넣기

  • 사용 중인 라이브러리 확인~

image

  • 서블릿 설정하기. web.xml에
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<display-name>hellospring</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!-- Dispatcher Servlet -->
	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

image

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<context:annotation-config />
	<context:component-scan base-package="com.poscodx.hellospring.controller" /> 

</beans>

  • 여기에서 com.poscodx.hellospring.controller 꼭 이 이름대로 만들어져있어야함.

image

image

package com.poscodx.hellospring.controller;

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

@Controller
public class HelloController {

	@RequestMapping("/hello")
	public String hello() {
		return "/WEB-INF/views/hello.jsp";
	}
}


  • /WEB-INF/views/hello.jsp 만들기
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Hello Spring</h1>
</body>
</html>
  • server에 add 후 실행

image


dispatcherServlet

image

*** handler Mapping ( url과 controller에 전달될 res, req를 매핑)


실습

하나

package com.poscodx.hellospring.controller;

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

@Controller
public class HelloController {

	@RequestMapping("/hello")
	public String hello() {
		return "/WEB-INF/views/hello.jsp";
	}
	
	@RequestMapping("/hello2")
	public String hello2(String name) {
		System.out.println(name);
		return "/WEB-INF/views/hello.jsp";
	}
	
}

image

  • 얘는 int no 여도, string으로 param을 받아서 parseInt할 필요없이 자동으로 변환시켜주는 일까지 해준다.

	
	@RequestMapping("/hello3")
	public ModelAndView hello3(String n) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("/WEB-INF/views/hello3.jsp");
		mav.addObject("name", n);
		
		return mav;
	}

	//이 방법 추천!!
	@RequestMapping("/hello4")
	public String hello4(String n, Model model) {
		model.addAttribute("name",n);
		
		return "/WEB-INF/views/hello3.jsp";
	}
  • hello3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Hello ${name }</h1>
</body>
</html>

image

	@ResponseBody   //바디에 붙었따.
	@RequestMapping("/hello5")
	public String hello5() {
		return "<h1>Hello Spring<h1>";
	}

image

@ResponseBody
	@RequestMapping("/hello5")
	public String hello5() {
		return "안녕 스프링씨";
	}

image

  • 한글 깨진다. utf-8 설정이 안되어있기 때문이다.

다섯

@RequestMapping("/hello6")
	public String hello6() {
		return "redirect:/hello";
	}

image

여섯

	@RequestMapping("/hello7")
	public void hello7(HttpServletRequest request, HttpServletResponse resonse, Writer out) throws Exception{
		String name = request.getParameter("n");
		out.write("hello " + name );
	}

  • 이렇게 쓸 수는 있지만, 이렇게 쓰지 말기. 이미 spring에서 이것과 관련하여 처리해주는 게 있기 때문이다.