Spring Framework (1) - 기본 개념 및 Mapping 방식(get, post) Day 48

jaehoon ahn·2025년 11월 24일

Spring boot

목록 보기
1/20
post-thumbnail

01_Spring Framework

Framework란?

  • 애플리케이션 개발 시 필요한 기본 구조와 뼈대를 제공하는 툴
  • 제공되는 구조에 맞게 코딩을 진행하면 되기 때문에 개발 시간이 줄고, 효율적인 개발을 할 수 있음
  • 코드의 재사용성을 증가 시키기 위해 일련의 클래스 묶으이나 뼈대, 틀을 라이브러리 형태로 제공함

Library란?

  • 자주 사용되는 기능을 모아둔 코드의 집합
  • 개발자 또는 회사에서 개발한 기능(코드)를 라이브러리로 만들어서 배포 → 해당 기능이 필요한 개발자가 라이브러리를 자신의 코드에 추가해서 사용

API(Application Programming Interface)

  • 서로 다른 소프트웨어 구성 요소 간의 상호 작용을 정의하는 규약
  • API를 통해 서로 다른 프로그램들이 데이터를 주고받거나 기능을 호출하여 통신할 수 있음

Spring Framework란?

  • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크
  • 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공

Spring Framework의 주요 특징(면접)⭐⭐⭐

  • IOC⭐⭐⭐⭐⭐
    • 제어의 반전을 의미
    • 개발자가 new 연산자를 통해서 객체를 생성하지 않음 ⇒ Spring Container가 만들어둔 객체를 필요할 때 얻어와서 사용함
  • DI⭐⭐⭐⭐⭐
    • 개발자가 직접 객체를 생성하지 않고 Spring Container가 만들어둔 객체를 필요한 위치에서 주입함.

⇒ 위 두가지는 묶어서 기억하기

  • POJO
    • 다른 특정 기술에 종속되지 않고 자바 코드만으로 Spring 프로젝트를 구현할 수 있는 것.
  • AOP
  • Spring MVC
    • Servlet Class
      • Controller
        • @Controller
    • Model
      • Service
        • @Service
      • DAO
        • @Repository
      • DTO
  • PSA

Spring Container 구성 모듈(기본 구성)

  • Core Container
    • Beans
      • IOC(제어의 역전, 개발자가 객체를 직접 만들지 않고 Spring Container가 객체를 만듬 → 이걸 Bean이라고 함)/DI의 개념을 나타내는 것
      • 즉, Spring Container가 만드는 객체를 Beans이라고 부름
      • 모여있는 공간이 Core Container

  • Data 접근 계층
    • MyBatis로 사용할 것
    • 영속성
      • 영원히 지속 가능한 성질 = DB
  • Web 계층
  • AOP 계층
  • Core Container
    • 스프링의 핵심
    • BeanFactory가 객체를 만드는 공장

Spring MVC

  • Spring Framework 에서는 클라이언트의 화면을 표현하기 위한 View와 서비스를 수행하기 위한 개발 로직 부분을 나누는 MVC2 패턴을 지원함.

  1. Client 웹브라우저
  2. Dispatcher Servlet⭐⭐⭐
    1. 가장 요청을 먼저 받는 것
      1. RequestDispatcher(단순 배달부, 알바생)와는 완전 다른 것
    2. Spring MVC 전체중에 가장 중요
    3. 중앙의 제어자, 컨트롤러임
    4. 모든걸 관리함 → 두뇌와 같은 역할
    5. MVC 요청에 대한 전체 흐름을 관리하는 역할
    6. 요청에 맞는 컨트롤러가 있는지 확인함
  3. Handler Mapping
    1. 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지 결정
  4. Controller
    1. 서비스를 호출하고 요청을 받아서 Service →DAO → DB 갔다가 결과값을 가지고 돌아옴
  5. Controller가 Dispatcher Servlet에게 보내고, 이 Dispatcher는 View Resolver의 도움을 받아서 View를 선택해서 다시 리턴하고, 최종적으로 Client 웹 브라우저에게 보내서 응답하게 함.

  • 응답(결과 화면)
    • SpringBoot 결과 하면을 나타내는 기본 스펙 → 타임리프
  1. Spring MVC(Legacy)
  2. 전자정부프레임워크
  3. Spring boot ✔ (수업에서 배울 내용)

02_Spring IOC/DI

IOC

  • IOC란, 프로그램을 구동하는데 필요한 객체에 대한 생성, 변경 등의 관리를 프로그램을 개발한흔 사람이 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말함
  • 스프링은 IOC를 통해 필요한 객체의 생성부터 생명 주기까지 해당 객체에 대한 관리를 직접 수행

Bean(빈)

  • Spring에서 IOC를 이용해 직접 생성하고 생명 주기 제어를 담당하는 객체
  • (개발자가 생성하고 관리하는 객체는 Instance)
  • Spring에서 생성하고 관리하는 객체
  • “스프링이 직접 만든 객체” → 이걸 Bean이라고 부름.

IOC 관련 어노테이션

  • 특정 클래스에 IOC 관련 어노테이션을 작성

→ Bean으로 등록되어 서버 실행 시 Spring Container에 의해 Bean(객체)으로 만들어짐

DI

  • DI란, IOC 구현의 핵심 기술로 IOC를 통해 Spring이 생성하고 관리하는 Bean(객체)을 필요한 곳에 주입하는 것
  • (객체 생성을 개발자가 아닌 Spring에게 의존하고 생성된 객체를 개발자가 필요한 곳에 주입하는 것)
  • 이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화할 수 있음
  • 객체간의 종속 관계(결합도)를 약화 시킬 수 있음

DI 관련 어노테이션

  • @Autowired
    • 상속, 같은 타입에게 빈을 주입해줌
  • Qualifier
    • 같은 타입이 있을 때, 여러 빈이 있을 때 선택적으로 넣을 수 있다는 것
    • 많이 사용안함

Spring Boot란?

  • Spring MVC Project 구성 시 필요했던 복잡한 환경 설정을 최소화 하여
    개발자로 하여금 비즈니스 로직 구현에 집중할 수 있도하기 위해 개발됨

Spring Boot의 장점

  • 내장된 서버(Tomcat 등)를 제공해서 war 배포 없이 독립 실행이 가능한 웹애플리케이션을 개발할 수 있음 → Spring MVC Project처럼 Tomcat 서버를 Start 하는 것이 아닌
    Java Project 처럼 main 메서드가 작성된 class를 Run해서 실행
    —> 자동으로 내장된 Tomcat 서버가 시작됨
  • 다양한 Starter POM 파일을 제공해서 Maven, Gradle 등의 빌드 도구 구성, 라이브러리 관리를 간소화
  • Spring Starter를 이용해서 프로젝트를 생성 및 초기 설정을 간소화

STS4 설치

Tools

롬복 설치

java -jar .\lombok.jar
-> lo + tab하면 자동완성 됌

⇒ sts4 실행파일을 경로로 설정해주고 설치해주면 끝

프로젝트 생성

  • ctrl + n → spring starter Project

  • Type
    • 빌드 타입을 의미
    • Gradle
    • Maven
      • 즉, 빌드 자동화 도구
      • 개발자들이 설정해야하는(코드 컴파일, 테스트, 패키징, 라이브러리 다운로드, 배포 등) 수동으로 해야하는 귀찮은 설정들을 자동으로 처리해주는 도구
  • Packaging
    • 배포를 하기위해 압축
  • Group
    • example.com이라는 주소가 됌
    • 즉, 주소명
    • Group + Artifact로 패키지 명으로 정해짐

⇒ 위와 같이 설정

⇒ 의존성 모듈 추가

파일구조 파악

  • src/main/java: 자바 소스코드를 모아두는 폴더
  • src/main/resources : 자바에서 사용할 자원, 설정 파일을 모아두는 폴더
    • templates : Java 템플릿을 모아두는 폴더(thymeleaf)
    • static : templates에 적용될 정적 자원을 모아두는 폴더(JS, CSS, 이미지)
    • application.properties : Spring Boot 프로젝트 관련 설정을 정의하는 파일
  • build.gradle : gradle 프로젝트에 필요한 라이브러리, 배포, 빌드 관련 설정을 작성하는 파일
  • @SpringBootApplication : Spring Boot Application에 필요한 필수 어노테이션을 모아둔 어노테이션

집에서 import할 때 한글이 깨진다면

⇒ UTF-8로 설정

application.properties

# 스프링부트 프로젝트 관련 설정을 정의하는 파일 (중요) ⭐⭐⭐
# key:value 형태로 설정하고 싶은 내용을 정의하면 됌

# 해당 파일에 설정 작성 시 프로젝트 전반적으로 설정이 적용됨

# 애플리케이션(프로그램) 이름
spring.application.name=demoProject1

# http의 기본포트 번호 이용 => 80번
# 즉, localhost로 구동시키는 방법

# port 번호를 80으로 변경할 것 (80은 HTTP의 기본 포트 번호, 브라우저에서 포트번호 없이 접속 가능)
server.port=80
# => localhost만 쳐도 창이 나옴

# Spring DevTools (자동 리로드, 서버 재시작) 설정
# 브라우저 자동 새로고침 기능
spring.devtools.livereload.enabled=true

# 코드 변경 시 서버 자동 재시작
spring.devtools.restart.enabled=true

# 타임리프 캐시 비활성화(HTML 파일 수정 시 바로 변경사항 확인할 수 있도록)
spring.thymeleaf.cache=false

# 로그 레벨 지정
logging.level.edu.kh.demo=debug
# 로그레벨을 디버그 레벨로 보겠다는 의미

# 로그 레벨의 6단계⭐⭐⭐
# TRACE : 가장 상세한 로그레벨로, 상세한 정보를 기록
# Ex) e.printStackTrace();
# DEBUG : 디버깅에 유용한 정보를 기록(값 추적)
# INFO : 일반적인 정보 메시지 기록(Spring Boot에서는 자동으로 기본레벨을 INFO를 사용)
# WARN : 경고 메시지를 기록
# ERROR : 오류 메시지를 기록한 레벨로, 심각한 문제가 발생했을 때 사용하는 것
# FATAL : 가장 심각한 오류로, 프로그램 실행 중단의 치명적 오류를 기록하는 것

import 방법

ojdbc 설치

// https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11
	implementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0'

추가 후

Refresh Gradle Project 실행

실습

TestController.java

package edu.kh.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

// instance : 개발자가 직접 new 연산자를 통해 만든 객체, 관리하는 객체

// bean : Spring Container가 만들고, 관리하는 객체
//-> IOC(제어의 반전) : 객체의 생성 및 생명주기의 권한이 개발자가 아닌
// 프레임워크에게 있다.

// 서버 실행 시 Spring Container가 Component Scan(Bean Scanning) 을 수행하여
// @Component, @Repository, @Service, @Controller 어노테이션이 붙은 클래스를 
// 모두 찾아 Bean으로 등록(객체로 생성)

@Controller // 요청/응답을 제어하는 역할인 컨트롤러임을 명시 + Bean 등록(즉, 바로 객체화가 된다는 것)
// @RequestMapping("/test") // /test로 오는 요청을 다 받아주겠다는 의미(클래스 레벨)
public class TestController {
	// 기존 Servlet : 클래스 단위로 하나의 요청만 처리 가능했음
	// Spring : 메서드 단위로 요청 처리 가능

	// @RequestMapping("요청주소")
	// - 요청 주소를 처리할 클래스 or 메서드를 매핑하는 어노테이션

	// 1) 클래스와 메서드에 함께 작성하는 방법
	// - 공통 주소를 매핑한다. ->
	// ex) /test/insert, /test/update .. 등

	/*
	 * @RequestMapping("/insert") public void methodA() { // /test/insert 요청을
	 * methodA가 처리하겠다 }
	 * 
	 * @RequestMapping("/update") public void methodB() { // /test/updatet 요청을
	 * methodB가 처리하겠다. }
	 * 
	 * @RequestMapping("/select") public void methodC() { // /test/select 요청을
	 * methodC가 처리하겠다. }
	 */

	// 2) 메서드에만 작성하는 방법 :
	// - 요청 주소와 해당 메서드를 매핑
	// - GET/POST 가리지 않고 매핑을 해줌
	// (속성을 통해서 지정 가능 or 다른 어노테이션 이용 가능)

	// @RequestMapping(value = "/test", method = RequestMethod.GET)
	// Get방식만 처리하겠다는 의미
	@RequestMapping("/test") // /test 요청 시 testMethod가 매핑하여 처리함
	// GET/POST 가리지 않고 다 받음
	public String testMethod() {
		System.out.println("/test 요청 받음");
		
		// Controller 메서드의 반환형은 앞으로 String일 것!
		/*
		 * Controller 메서드의 반환형이 String인 이유!
		 * -> 메서드에서 반환되는 문자열이
		 * forward할 html 파일의 경로가 되기 때문!
		 * 
		 * Thymeleaf : JSP 대신 사용하는 템플릿 엔진(html 형태)
		 * 
		 * classpath : == src/main/resources
		 * 접두사 : classpath:/templates/ ⭐⭐⭐ 
		 * 접미사 : .html
		 * */
		// src/main/resources/templates/test.html <- 이게 경로가 된다는 의미
		return "test"; // 접두사 + 반환값 + 접미사 경로의 html로 forward 하게 됌
	}
}

ParameterController.java

package edu.kh.demo.controller;

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

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;

@Controller // 요청/응답 제어하는 역할 명시 + Bean 등록
@RequestMapping("param") // /param으로 시작하는 요청을 현재 컨트롤러로 매핑
@Slf4j
public class ParameterController {

	/*
	 * HttpServletReqeust :
	 * - 요청 클라이언트의 정보, 제출된 파라미터 등을 저장한 객체
	 * - 클라이언트 요청시 생성되는 객체
	 * 
	 * Spring의 Controller 단 메서드 작성 시, 
	 * 매개변수에 원하는 객체를 작성하면
	 * 존재하는 객체를 바인딩 또는 없으면 생성해서 바인딩
	 * --> ArgumentResolver가 존재함
	 * Argument(전달인자) + Resolver(해결사) => 전달인자 해결사
	 * 
	 * */
	@GetMapping("main")
	public String paramMain() {
		
		// /param/main Get 방식 요청 매핑
		// src/main/resources/templates/param/param-main.html로 forward
		return "param/param-main";
	}

	@PostMapping("test1") // /param/test1 POST 방식 요청 매핑
	public String paramTest1(HttpServletRequest req) {
		String name = req.getParameter("inputName");
		int age = Integer.parseInt(req.getParameter("inputAge"));
		String address = req.getParameter("inputAddress");
		log.debug("name : " + name);
		log.debug("address : " + address );
		log.debug("age : " + age);
		
		/*
		 * Spring에서 Redirect(재요청) 하는 방법!
		 * - Controller 메서드 반환값에
		 * "redirect:재요청주소"; 작성
		 * */
		return "redirect:/param/main";
		// redirect는 get 방식
	}

}

0개의 댓글