개발 *´꒳`*/Framework

Spring에 대해서

winterlove 2024. 7. 31. 08:37

1. SpringFramework란? 

자바 플랫폼을 위한 애플리케이션 프레임워크로 주로 엔터프라이즈 개발에 사용된다.
스프링은 모듈화, 경량화, 테스트 용이성을 중요시하며 POJO 프로그래밍 모델을 통해 객체지향 설계 원칙을 따른다.

프레임워크란 ? 
소프트웨어 개발을 위한 구조, 뼈대를 제공하는 일종의 플랫폼이다.
다양한 기능. 도구를 제공하여 특정 유형 애플리케이션을 개발하는데 필요한 구조를 갖추고 있다.
ex) Spring Framework, Django, React

 

2. Spring의 핵심 개념

- POJO(Plain Old Java Object) : 단순한, 순수한 Java 객체를 의미한다.

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Message : " + message);
    }
}

 

- IoC(Inversion of Control, 제어의 역전) : 객체 생성, 의존성 주입을 관리.
스프링 컨테이너가 대신해주어 객체 간 결합도를 낮추고 코드 유연성을 높인다.

예시1) XML 기반 설정

- 철자 검사기 클래스 및 텍스트 편집기 클래스

public class SpellChecker {
    public void checkSpelling() {
        System.out.println("Checking spelling...");
    }
}

public class TextEditor {
    private SpellChecker spellChecker;

    public void setSpellChecker(SpellChecker spellChecker) {
        this.spellChecker = spellChecker;
    }

    public void spellCheck() {
        spellChecker.checkSpelling();
    }
}

- 스프링 설정 파일 (test.xml)
SpellChecker와 TextEditor 객체를 정의, TextEditor에 SpellChecker를 주입

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="spellChecker" class="com.example.SpellChecker"/>
    <bean id="textEditor" class="com.example.TextEditor">
        <property name="spellChecker" ref="spellChecker"/>
    </bean>
</beans>

 

예시2) Java 기반 설정 (Annotation, JavaConfig)

SpellChecker와 TextEditor 클래스는 동일

- 스프링 설정 클래스

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public SpellChecker spellChecker() {
        return new SpellChecker();
    }

    @Bean
    public TextEditor textEditor() {
        return new TextEditor(spellChecker());
    }
}


- DI
(Dependency Injection, 의존성 주입) : 객체 간 의존성을 스프링 컨테이너과 주입 
IoC를 구현하는 주요 방법이다.
객체가 자신의 의존성을 외부에서 주입받음으로서 객체간 결합도 낮추고 유연성을 높인다.

 

- POJO와 Spring의 결합

 

DI  (Dependency Injection, 의존성 주입)
객체가 자신의 의존성을 직접 생성하지 않고 외부에서 주입받는 디자인 패턴.
객체 간 결합도를 낮추어 코드 재사용성 ↑ 테스트, 유지보수 용이

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}


AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
횡단 관심사(흩어진 관심사)를 모듈화하는 프로그래밍 패러다임
횡단 관심사란 핵심 비즈니스 로직과 별개로 여러 모듈에 걸쳐 나타나는 기능 (로깅, 보안, 트랜잭션 관리 등)
스프링 빈에만 AOP 적용 가능하다.
즉 어떤 로직을 기준으로 핵심, 부가적인 관점을 나누어 보고 각 관점 기준으로 모듈화 하는 것

  • Aspect:  횡단 관심사를 모듈화
  • Target : Aspect를 적용하는 곳 ( Class, Method 등)
  • Join Point : 횡단 관심사가 실행될 수 있는 지점 ( 메소드 호출 지점 )
  • Advice: 특정 Join Point에서 실행될 코드 정의 (Before, After, Around 등)
  • Pointcut : Advice가 적용될 Join Point 정의

 

트랜잭션 관리
데이터베이스 작업을 논리적인 작업 단위로 묶어 모두 성공, 모두 실패를 보장하는 것
일관성 유지하며 실패 시 안전하게 롤백한다

@Transactional 어노테이션으로 하나라도 예외가 발생하면 모든 작업이 롤백될 수 있도록한다.

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }
}

 

3. Spring의 MVC

스프링 프레임워크의 개발을 위한 모듈로 Model - View - Controller 패턴을 기반으로한다.
3가지로 분리하여 개발의 효율성을 높이고 유지보수를 용이하게 한다.

  • Model : 애플리케이션 데이터, 상태. 일반적으로 POJO로 구현된다.
  • View : 사용자에게 데이터를 표시하는 상태
  • Controller : 요청을 처리하고 적절한 뷰로 모델 데이터를 전달 (@Controller)
  1. 사용자가 브라우저에서 요청
  2. DispatcherServlet 요청을 받아 적절한 컨트롤러로 전달
  3. 컨트롤러는 요청을 처리하고 모델 데이터를 준비한 후 뷰로 전달.

1. DispatcherServlet

  • 중앙 제어 역할: 모든 HTTP 요청을 받아 적절한 컨트롤러에 전달합니다.
  • 프론트 컨트롤러: 프론트 컨트롤러 패턴을 구현하여, 하나의 진입점으로 모든 요청을 처리합니다.
  • 핵심 역할: 요청의 라우팅, 핸들러 매핑, 뷰 리졸버를 통해 응답을 생성합니다.

2. HandlerMapping

  • 요청 매핑: URL 요청을 적절한 컨트롤러와 연결합니다.
  • 구현체: RequestMappingHandlerMapping이 가장 많이 사용됩니다.

3. Controller

  • 요청 처리: 비즈니스 로직을 처리하고, 모델 데이터를 준비하여 뷰에 전달합니다.
  • 핸들러 메서드: 각 메서드는 특정 URL 패턴과 HTTP 메서드(GET, POST 등)에 매핑됩니다.

4. ModelAndView

  • 데이터 및 뷰: 컨트롤러에서 데이터를 담고, 뷰 이름을 지정하여 반환합니다.

5. ViewResolver

  • 뷰 선택: 컨트롤러가 반환한 뷰 이름을 실제 뷰 객체로 변환합니다.
  • 뷰 렌더링: 선택된 뷰를 통해 최종 HTML을 생성하고 응답으로 반환합니다.

6. View

  • 응답 생성: 최종적으로 사용자에게 보여질 웹 페이지를 렌더링합니다.
  • 템플릿 엔진: Thymeleaf, JSP, FreeMarker 등이 있다.

- Model

package com.example.demo.model;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

- Controller

package com.example.demo;

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

@Controller
public class HomeController {
    
    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "home";
    }
}

- View

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Home</title>
</head>
<body>
    <h1 th:text="${message}">Placeholder message</h1>
    <form action="/addUser" method="post">
        <input type="text" name="name" placeholder="Enter name">
        <button type="submit">Add User</button>
    </form>
</body>
</html>