Spring Framework

AWESOMee·2022년 7월 8일
0

Spring Framework

목록 보기
1/3
post-thumbnail

Spring Framework

Framework

  • Framework 등장 전에는 모든 개발자들이 본인 스타일대로 개발을 진행
  • -> 구조나 형식이 일정하지 않아 소스코드의 통합이나 유지보수가 어려움
  • Framework : 개발자들이 공통된 틀에 공통된 구조와 형식을 가지고 개발할 수 있도록 기본적인 웹 개발 틀을 제공

Spring Framework의 장점

  • Framework에서 구조와 골격을 제공하기 때문에 개발자들은 business logic만 구현하면 되기 때문에 빠르게 구현 가능
  • Framework로 구현된 Web Application은 구조가 거의 비슷하기 때문에 관리 및 유지보수의 편의성이 증가

Spring Framework의 특징

  • AOP(Aspect Oriented Programming) - 관점지향 프로그래밍
    • 다수의 업무를 개발할 때 공통적으로 들어가는 소스코드들(로그를 찍거나 트랜잭션처리를 하는 등)은 Spring에서 관리
    • 공통적인 소스코드는 신경쓸 필요 없이 업무로직만 구현하면 됨
    • 공통적인 소스코드들을 횡단관심이라고 부르면 스프링 설정파일로 관리
  • 컨테이너 기반의 언어
    • Spring안의 컨테이너들은 설정파일을 읽어서 객체의 생성 및 소멸 등 생명주기를 관리하며 Framework가 동작하도록 만들어 줌
  • IOC(Inversion Od Control) 컨테이너 - 제어의 역전
    • Spring에서는 설정파일로 객체를 생성할 수 있음
    • 제어의 역전이라는 의미는 개발자가 제어하던 것들을 Framework가 대신해주는 것을 의미
    • DL(Depency Lookup)
      • 설정파일을 객체의 생성과 소멸을 관리해주는 bean이나 Annotation을 이용하여 설정
    • DI(Depency Injection)
      • 의존성 주입은 생성된 객체에 형태가 알맞는 객체를 넣어주는 것
      • Spring 설정파일로 개발자가 직접 의존성을 주입하는 것이 아닌 프레임워크에서 자동으로 주입하도록 설정
      • setter, 생성자, Annotation을 이용하여 설정

JSP/Servlet

JSP(Java Server Page)

  • HTML문서에서 자바소스를 사용하기 위해 개발된 기술
  • JSP도 Servlet을 상속받아 만들어지기 때문에 WAS에서 클래스로 컴파일 된 후 동작
  • 이전에는 모든 처리를 JSP에서 했지만, 현재는 화면단(View) 만 담당하도록 구현되고 있음
  • 백엔드 언어라고 볼 수 있고, 현재는 화면단만 담당하기 때문에 프론트엔드 언어라고도 볼 수 있음

Servlet

  • 자바 소스코드에서 HTML 태그를 사용하기 위해 개발된 기술
  • 점차 백엔드 쪽으로 발전된 상태로 현재는 사용자의 요청을 받는 Request, 응답인 Response 등을 처리하도록 발전함
  • 요청과 요청에 대한 응답은 무조건 Servlet을 통해서 진행

WEB Server & WAS

Web의 기본 구조

사용자가 Web server에 요청을 보냈을 때
-> Web server에서 직접 처리 가능한 작업은 사용자에게 직접 응답을 보냄
-> Web server에서 직접 처리 불가능한 작업은 Web server에서 WAS로 요청을 보내고 WAS에서 Web server를 통해 사용자에게 응답을 보내게 됨

Web Server

  • 사용자로부터 요청을 받아들이고 사용자에게 응답을 전달하는 서버
  • 정적인 resources(html, css, image etc..)를 관리
  • apache, webtob, ngix etc..

WAS(Web Application Server)

  • 실질적으로 Web application을 구동해주는 서버
  • 동적인 resources(jsp, class, xml etc..)를 관리
  • 사용자가 WEB server에서 직접 처리할 수 없는 요청(DB 데이터 조회 등)을 WAS에서 해당 class의 메소드를 실행시켜서 응답을 Web server로 전달
  • tomcat, jeus, Web Logic etc..

GET/POST

파라미터를 넘길 때는 key=value로 매핑해서 넘겨줌

GET

  • a tag의 link를 클릭할 때, 주소창에 주소를 직접 입력할 때, form tag의 메소드가 get으로 설정됐을 때, 비동기통신(ajax) 방식을 get으로 설정했을 때는 GET방식으로 요청을 보냄
  • GET방식으로 요청할 시 파라미터들이 주소에 표출됨(query string)

POST

  • form tag의 메소드가 post일 때, 비동기통신(ajax) 방식이 post일 때 POST방식으로 요청을 보냄
  • POST방식은 파라미터들이 표출되지 않음

Exercise

home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	${hi}
</h1>

<a href="test.do?firstName=yeji&lastName=kim&age=29&job=none">click</a>
<form action="test.do" method="post">
	<input type="text" placeholder="firstName" name="firstName"> <!-- name:= key -->
	<input type="text" placeholder="lastName" name="lastName">
	<input type="text" placeholder="age" name="age">
	<input type="text" placeholder="job" name="job">
	<button type="submit">Submit</button>
</form>

</body>
</html>

HomeVO.java

package com.spring.boardweb;

// VO: ValueObjec. 데이터 테이블과 1:1 매칭되도록 구현하는 게 원칙
// := DTO: Data Transfer Object
public class HomeVO {
	private String firstName;
	private String lastName;
	private int age;
	private String job;
	
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
}

HomeController.java

package com.spring.boardweb.controller;

import java.util.Map;

//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.spring.boardweb.HomeVO;
import com.spring.boardweb.service.HomeService;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	// @Autowired는 의존성을 주입할 때 모양만 비교함
	// HomeService 모양으로 생성된 객체가 있는 지 없는 지 찾게됨
	// 있으면 주입, 없으면 에러발생
	// HomeService 모양의 객체가 여러개 존재하면 에러 발생
	// @Autowired // homeService = new HomeServiceImpl();
	// @Qualifier는 의존성을 주입할 때 모양과 이름을 비교함
	// 같은 모양의 객체가 여러개 존재할 때 이름으로 비교하여 의존성 주입함
	@Qualifier("homeServiceImpl")
	HomeService homeService;
	
	// HomeService homeService2 = new HomeServiceImpl();
	// HomeService homeService3 = new HomeServiceImplTwo();
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Model model) {

		model.addAttribute("hi", "Hello spring");
		
		return "home";
	}
	
	// 화면단에서 전달되는 파라미터 받기
	// 1. @RequestParam 이용
//	@RequestMapping(value = "test.do", method = RequestMethod.GET)
//	public String testGet(@RequestParam("firstName") String firstName,
//			@RequestParam("lastName") String lastName) {
//		System.out.println("get요청 처리");
//		System.out.println("get firstName =====" + firstName);
//		System.out.println("get lastName =====" + lastName);
//		return "home";
//	}
//	
//	@RequestMapping(value = "test.do", method = RequestMethod.POST)
//	public String testPost(@RequestParam("firstName") String firstName,
//			@RequestParam("lastName") String lastName) {
//		System.out.println("post요청 처리");
//		System.out.println("get firstName =====" + firstName);
//		System.out.println("get lastName =====" + lastName);
//		return "home";
//	}
	
	// 2. @RequestParam 이용하여 Map에 할당
//	@RequestMapping(value = "test.do", method = RequestMethod.GET)
//	public String testGet(@RequestParam Map<String, Object> paramMap) {
//		System.out.println("get요청 처리");
//		System.out.println("get firstName =====" + paramMap.get("firstName"));
//		System.out.println("get lastName =====" + paramMap.get("lastName"));
//		System.out.println("get age =====" + paramMap.get("age"));
//		System.out.println("get job =====" + paramMap.get("job"));
//		// return "home" : /WEB-INF/views/home.jsp로 이동하게 됨
//		return "home";
//	}
//	
//	@RequestMapping(value = "test.do", method = RequestMethod.POST)
//	public String testPost(@RequestParam Map<String, Object> paramMap) {
//		System.out.println("post요청 처리");
//		System.out.println("get firstName =====" + paramMap.get("firstName"));
//		System.out.println("get lastName =====" + paramMap.get("lastName"));
//		System.out.println("get age =====" + paramMap.get("age"));
//		System.out.println("get job =====" + paramMap.get("job"));
//		// return "redirect:/" : viewResolver를 통지 않고 주소가 "localhost:8090/"으로 바로 이동하도록 설정 가능
//		return "redirect:/";
	
	// 3. Command 객체를 이용해서 파라미터 받기
	// 	  Command 객체: 함수의 매개변수 안에 선언된 객체
	@RequestMapping(value = "test.do", method = RequestMethod.GET)
	public String testGet(HomeVO homeVO) {
		System.out.println("get요청 처리");
		System.out.println("get firstName =====" + homeVO.getFirstName());
		System.out.println("get lastName =====" + homeVO.getLastName());
		System.out.println("get age =====" + homeVO.getAge());
		System.out.println("get job =====" + homeVO.getJob());
		return "home";
	}
	
	@RequestMapping(value = "test.do", method = RequestMethod.POST)
	public String testPost(HomeVO homeVO) {
		System.out.println("post요청 처리");
		System.out.println("get firstName =====" + homeVO.getFirstName());
		System.out.println("get lastName =====" + homeVO.getLastName());
		System.out.println("get age =====" + homeVO.getAge());
		System.out.println("get job =====" + homeVO.getJob());
		return "redirect:/";
	}
	
}
profile
개발을 배우는 듯 하면서도

0개의 댓글