💡 SPRING 개요

프레임워크(Framework)란?
뼈대, 체제, 틀
개발에서 기본이 되는 툴을 제공해 줌으로써 개발자에게 모든 것을 위임하는 것이 아니라 어플리케이션의 기본 아키텍쳐는 프레임워크가 제공하고 그 뼈대에 살을 붙이는 작업만 개발자가 하는 것
- 프레임워크의 장점
- 빠른 구현 시간
- 개발자는 비지니스 로직만 구현하면 됨
- 코드에 집중할 수 있음
- 쉬운 관리
- 스프링은 동일한 프레임워크, 유지보수에 들어가는 인력과 시간 절약
- 개발자들의 역량 획일화
- 초급 개발자도 프레임워크를 통해 세련되고 효율적인 코드 생성
- 검증된 아키텍처의 재사용과 일관성 유지
- 빠른 구현 시간
스프링(Spring) 프레임워크란?

IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크
🎈 IoC란?
: 제어의 역행( = Inversion of Control )
: 낮은 결합도와 높은 응집도를 만족시켜줌.
🎈 AOP란?
: 관점 지향 프로그래밍 ( = Aspect Oriented Programming )
: 객체 지향 프로그래밍(OOP)를 보완하기 위한 개념
: OOP와 달리 “관점”을 기준으로 반복되고 공통적으로 사용되는 부분을 분리함으로써 모듈성을 증가시킨다.(OOP는 “클래스”기준)
IoC (Inversion of Control)

프로그램을 구성하고 실행하는 점에서 필요한 흐름이나 객체에 대한 생성, 변경 등의 관리를 사용자가 아닌 프레임워크에서 관리하는 개념
- 사용자가 필요한 객체의 생성과 소멸까지의 모든 생명주기 관리를 Container라는 객체에서 직접 관리하여 사용자는 객체 설계만 집중하도록 돕는다 ! → 코드에서 new를 쓰지 않음
→ 프레임워크에서 메모리 관리를 수행함으로 개발자는 Memory Leak에 대한 부담이 줄어든다.
🎈 Bean(빈)이란?
: 스프링에서 관리하는 객체 !
Bean Factory를 통해 생성되며 생성된 빈들을 관리하는 핵심 객체를 "컨테이너 (Context)"라고 함 .
✔ IoC 컨테이너 역할

- 객체의 생명주기와 의존성 관리
- VO (DTO / POJO) 객체의 생성, 초기화, 소멸 등의 처리 담당
- 개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스 코드 구현 시간 단축
DI (Dependency Injection)
객체 지향 프로그래밍에서 객체가 필요로 하는 의존성을 외부에서 주입해주는 설계 패턴 ( 종속성 주입 )
- Spring에서는 DI를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 테스트 용이성을 높인다 !
- 의존성 (Dependency) : 한 객체가 다른 객체를 필요로 하는 관계
- 주입 (Injection) : 필요한 의존성을 외부에서 제공해주는 행위
- IoC (Inversion of Control) : 제어의 역전 개념으로, 객체의 생성과 생명 주기를 개발자가 아닌 Spring 컨테이너가 관리
✔ DI 예제코드
import org.springframework.stereotype.Repository;
@Repository
public class MyDao {
public String getData() {
return "Hello from DAO!";
}
}
@Service
public class MyService {
private final MyDao myDao;
@Autowired
public MyService(MyDao myDao) {
this.myDao = myDao;
}
public String processData() {
return myDao.getData();
}
}
@RestController
public class MyController {
private final MyService myService;
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
@GetMapping("/data")
public String getData() {
return myService.processData();
}
}
- @Autowired 어노테이션
: Spring컨테이너가 해당 클래스의 인스턴스를 자동으로 주입하도록 지시
Spring의 동작 구조
✔ Spring 어플리케이션 초기화 과정

→ Spring 어플케이션을 초기화하기 위해선 사용자가 정의한 xml 파일로부터 필요한 Bean 객체를 읽어와 생성하거나 어노테이션을 기반으로 Bean을 생성하여 이를 Spring 컨테이너에 등록
✔ Spring 웹 처리 구조

→ Spring 웹의 모든 요청(Request)는 Servlet으로 구성된 DispatcherServlet를 통해 처리되며, DispatcherServlet은 요청의 URL을 기반으로 사용자가 정의한 Handler를 호출하여 요청을 처리함
💡 MVC2
MVC2 아키텍쳐

- Model-View-Controller 2 (MVC2) 는 소프트웨어 설계 패턴 중 하나
- 애플리케이션을 모델, 뷰, 컨트롤러의 세 가지 주요 컴포넌트로 분리하여 개발의 복잡성을 줄이고 유지보수성을 높이는 것이 목표 !
- 모델(Model) : 애플리케이션의 핵심 데이터 구조와 비즈니스 로직을 포함.
- 뷰(View): 사용자 인터페이스를 담당하는 컴포넌트
- 컨트롤러(Controller): 애플리케이션의 흐름 제어를 담당하며, 모델과 뷰를 연결하는 역할
✔ MVC2 구성요소
| 구성 요소 | 역할 및 설명 |
| Model | 애플리케이션의 데이터와 상태를 관리 - 데이터베이스와의 상호작용을 처리 - 데이터 구조를 정의하고 데이터의 상태와 관련된 로직을 포함 예: 데이터베이스 접근 객체(DAO), 데이터를 담는 객체(Value Object, DTO) 등 |
| View | 사용자에게 데이터를 표시하는 역할 - 모델 데이터를 기반으로 사용자 인터페이스를 렌더링 - 사용자 입력을 받아 컨트롤러에 전달 예: JSP, HTML, Thymeleaf, FreeMarker 등 |
| Controller | 사용자 요청을 처리하고, 요청에 따라 모델을 업데이트하거나, 적절한 뷰를 선택하여 응답 - 사용자 요청을 받아 모델과 상호작용 - 그 결과를 뷰에 전달하여 사용자에게 응답 예: Spring MVC의 @Controller, @RestController, @RequestMapping 등 |
| Config | 애플리케이션의 설정을 담당 - 애플리케이션 전반에 걸친 설정을 관리 - 웹 설정, 데이터 소스 설정 등을 포함 예: Spring 설정 파일(AppConfig, WebConfig 등) |
| Service | 비즈니스 로직과 데이터 접근을 관리 - 비즈니스 규칙을 적용하고 처리 - DAO를 사용하여 데이터베이스와 상호작용 - 트랜잭션 관리를 수행 예: 비즈니스 로직을 처리하는 서비스 클래스 |
더 자세한 MVC
https://min-jii.tistory.com/71
[KB IT's Your Life] 2주차 컴포넌트 백엔드 💡
💡Back-end 개요✔Server-Client 구조: 서버-클라이언트(server-client) 구조란? 데이터를 저장하고 관리하는 서버 부분과 해당 서버에 접속하여 데이터를 열람하는 클라이언트 부분으로 구성된 네트
min-jii.tistory.com
Spring Annotation 방식
XML을 설정을 보조하는 기능으로, 코드상에 Annotation 을 기반으로 필요한 설정을 진행하면 이를 Spring에서 자동으로 Scanning 하여 필요한 Bean을 자동으로 생성하고 관리가 진행된다 !
✔ @Annotation 종류 - Bean 등록
| 어노테이션 | 설명 |
| @Component | 객체(컴포넌트)를 나타내는 일반적인 타입으로 <bean>태그와 동일한 역할. - 특정 역할이 없지만 bean을 통해 객체를 관리 하고 싶은 경우 활용 |
| @Repository | 퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, 데이터베이스)을 가진 클래스 ex) Data Access Object Class |
| @Service | 서비스 레이어, 비즈니스 로직을 가진 클래스 ex) Service Class |
| @Controller | 프리젠테이션 레이어, 웹 애플리케이션에서 View에서 전달된 웹 요청과 응답을 처리하는 클래스 ex) Controller Class |
| @RestController | RESTful Controller 구성 시 활용하는 클래스로 핸들러 메소드를 모두 @ResponseBody로 바꾸고 반환하는 객체를 JSON 또는 XML로 자동으로 변환하여 REST 서비스를 구현함. |
| @Configuration | 스프링의 설정에 관련된 어노테이션, 레거시에는 XML을 base로 설정하는 것이 일반적이었고, Boot의 경우는 XML을 모두 제거 되어 @Configuration을 통해 관련 설정을 수행 |
| @SessionAttributes | Controller에서 활용되며 특정 Session의 값을 Controller에서 Model에 담는 경우 이를 모두 세션으로 처리되도록 돕는 기능, ‘@SessionAttribute’와 기능상 유사하지만 다른 어노테이션! |
사용 예시
// Class 상위에 명시
@Controller
public class MemberController{
}
✔ @Annotation 종류 - 의존성 주입
| 어노테이션 | 설명 |
| @Autowired | 정밀한 의존 관계 주입(DI)이 필요한 경우에 활용. @Autowired는 필드 변수, Setter 메소드, 생성자, 일반 메소드에 적용 가능하며 의존하는 객체를 주입할 때는 주로 Type 이용. <property>, <constructor-arg>태그와 동일한 역할. → Spring 4.0 이후에는 해당 어노테이션을 생략해도 자동으로 Injection이 지원됨. |
| @Qualifier | @Autowired와 함께 쓰이며 한 프로젝트 내에 @Autowired로 의존성을 주입하고자 하는 객체가 여러 개 있을 경우, @Qualifier(“name”)을 통해 원하는 객체를 지정하여 주입 가능. |
| @Resource | 애플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용되며 @Resource는 프로퍼티, setter메소드에 적용 가능. 의존하는 객체를 주입할 때는 주로 Name 이용. |
| @Value | 단순한 값을 주입할 때 사용하는 어노테이션. 프로퍼티에서 가져올 수 있다. @Value(“Spring”)은 <property … value=“Spring”/>와 동일. @Value(“${database.username}”) String databaseName; |
사용예시
@Autowired
private MemberService service;
🎈 @Autowired와 @Resource 어노테이션
공통점 : @Component로 의존관계를 설정한 객체로부터 의존 관계 자동 주입
차이점 : @Autowired는 타입으로, @Resource는 이름으로 연결
✔ @Annotation 종류 - Handler method
| 어노테이션 | 설명 |
| @Bean | 메소드의 리턴 값을 기반으로 Bean을 생성 할 때 활용되는 어노테이션. initMethod 옵션을 사용하는 경우 Bean의 초기화가 가능한 메소드를 정의할 수 있다. |
| @RequestMapping | URL을 기반으로 Handler method를 Mapping 할 때 활용하는 대표적인 어노테이션. Get/Post를 지정할 수 있으며, 생략하는 경우 모두 처리, URL을 하나 또는 배열로 지정 가능. Controller 자체에도 선언할 수 있는데, 이때는 내부 핸들러 메소드의 prefix를 지정 가능. |
| @PostMapping | URL을 기반으로 POST 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용 + 일반 POST 처리). |
| @GetMapping | URL을 기반으로 GET 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용 + 일반 GET 처리). |
| @PutMapping | URL을 기반으로 PUT(Update) 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용). |
| @DeleteMapping | URL을 기반으로 Delete 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용). |
| @ResponseBody | 핸들러 메소드의 리턴 값을 통해 Body(응답 값)로 만들 때 활용하는 어노테이션. VIEW를 통한 WEB 처리가 아닌 Body를 직접 만들 때 활용 (REST 응답 또는 파일 전송 때 활용). |
| @CrossOrigin | CORS 관련 옵션을 설정 할 때 활용하는 어노테이션. * CORS란? : 프로토콜, 호스트명, 포트 등의 출처가 다른 서버의 자원을 요청했을 때 이를 허용하는 옵션 (REST나 AJAX 서비스 구현 시 자주 발생). |
| @Scheduled | 정해진 시간별로 핸들러 메소드를 스케줄로 호출하는 어노테이션, 전용 표기법 존재. |
| @ResponseStatus | 응답 시 사용자가 정의한 HTTP 상태코드(200, 404 등)를 응답하는 어노테이션. |
| @ExceptionHandler | 예외가 발생 시 핸들링이 가능한 핸들러 메소드를 지정하는 어노테이션. |
사용 예시
// @Bean 애너테이션을 사용하여 Spring Bean 등록
@Bean
public WebSocketHandler myHandler() {
return new ChatHandler();
}
// @Bean의 initMethod 속성을 사용하여 초기화 메서드 지정
@Bean(initMethod = "init")
public void init() {
// 초기화 로직 작성
}
// @RequestMapping 애너테이션을 사용하여 URL 매핑
@RequestMapping("/board/list")
public String list(Model model) {
// 비즈니스 로직 및 모델 설정
return "list"; // 뷰 이름 반환
}
✔ @Annotation 종류 - 파라미터 맵핑
| 어노테이션 | 설명 |
| @Bean | 메소드의 리턴 값을 기반으로 Bean을 생성 할 때 활용되는 어노테이션. initMethod 옵션을 사용하는 경우 Bean의 초기화가 가능한 메소드를 정의할 수 있다. |
| @RequestMapping | URL을 기반으로 Handler method를 Mapping 할 때 활용하는 대표적인 어노테이션. Get/Post를 지정할 수 있으며, 생략하는 경우 모두 처리, URL을 하나 또는 배열로 지정 가능. Controller 자체에도 선언할 수 있는데, 이때는 내부 핸들러 메소드의 prefix를 지정 가능. |
| @PostMapping | URL을 기반으로 POST 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용 + 일반 POST 처리). |
| @GetMapping | URL을 기반으로 GET 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용 + 일반 GET 처리). |
| @PutMapping | URL을 기반으로 PUT(Update) 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용). |
| @DeleteMapping | URL을 기반으로 Delete 요청 처리를 지원하는 Handler 메소드를 지정 (REST 전용). |
| @ResponseBody | 핸들러 메소드의 리턴 값을 통해 Body(응답 값)로 만들 때 활용하는 어노테이션. VIEW를 통한 WEB 처리가 아닌 Body를 직접 만들 때 활용 (REST 응답 또는 파일 전송 때 활용). |
| @CrossOrigin | CORS 관련 옵션을 설정 할 때 활용하는 어노테이션. CORS란 프로토콜, 호스트명, 포트 등의 출처가 다른 서버의 자원을 요청했을 때 이를 허용하는 옵션 (REST나 AJAX 서비스 구현 시 자주 발생). |
| @Scheduled | 정해진 시간별로 핸들러 메소드를 스케줄로 호출하는 어노테이션, 전용 표기법 존재. |
| @ResponseStatus | 응답 시 사용자가 정의한 HTTP 상태코드(200, 404 등)를 응답하는 어노테이션. |
| @ExceptionHandler | 예외가 발생 시 핸들링이 가능한 핸들러 메소드를 지정하는 어노테이션. |
사용 예시
// @Bean 애너테이션을 사용하여 Spring Bean 등록
@Bean
public WebSocketHandler myHandler() {
return new ChatHandler();
}
// @Bean의 initMethod 속성을 사용하여 초기화 메서드 지정
@Bean(initMethod = "init")
public void init() {
// 초기화 로직 작성
}
// @RequestMapping 애너테이션을 사용하여 URL 매핑
@RequestMapping("/board/list")
public String list(Model model) {
// 비즈니스 로직 및 모델 설정
return "list"; // 뷰 이름 반환
}
✔ @Annotation 종류 - 파라미터 맵핑
| 어노테이션 | 설명 |
| @RequestParam | 파라메터 처리에 가장 핵심적인 어노테이션으로 해당 어노테이션 기준으로 request의 파라메터를 사용자 변수로 주입해준다. 옵션 중에 defaultValue와 required가 있으며 자주 쓰이는 옵션 |
| @PathVariable | 경로(URL)의 일부를 파라메터로 주입하고 싶을 때 활용하는 어노테이션 이때 경로에 관련된 어노테이션에 반드시 가져올 변수를 지정해야한다. Ex) @GetMapping(“/member/{id}”) … @PathVariable String id, |
| @CookieValue | Response의 쿠키값을 가져올 때 활용하는 어노테이션 선언한 쿠키의 이름을 자동으로 파라메터로 주입하여 준다. |
| @SessionAttribute | 세션 값을 가져올 때 활용하는 어노테이션 선언한 세션 값을 자동으로 파라메터로 주입하여 준다. 만일 세션이 없는 경우 예외처리가 필요 |
| @ModelAttribute | 파라메터 처리의 핵심적인 어노테이션으로 해당 어노테이션은 Class(객체)로 맵핑 시켜준다. 맵핑되는 대상은 문자열, 숫자, 날짜와 배열까지만 가능하다. 해당 처리를 command 패턴이라 말함 |
| @RequestBody | ModelAttribute와 유사하지만 해당 어노테이션은 JSON을 Jackson 기반으로 파싱 하여 객체로 맵핑 한다. JSON 기반의 REST의 요청을 객체로 파싱하기 위해 주로 활용된다. |
| @RequestHeader | 요청 헤더의 값을 파라메터로 맵핑 할때 활용하는 어노테이션 |
| @RequestPart | RequestParam과 유사하지만, Part는 업로드 될 파일(multipart/form-data)이나 XML, JSON을 다룰 때 활용하는 어노테이션 |
💡 느낀점
처음으로 배우는 Spring 내용이였다 🎈 지난 주 코딩테스트 시험이 있어 바쁘게 지내왔다 🏍🏍
이번주는 Spring을 처음 시작하기 위한 개요나 이론에 대하여 많이 정리해왔지만 다음주는 실습 위주의 포스팅을 할 예정이다 ! 기대해주세요 🚗
나도 이제 곧,, 풀스택 개발자가 되는 것인가 --> I CAN DO IT !!!!
아직은 어렵게 느껴지는 스프링 용어들이지만 나의 모국어처럼 다가오는 그날까지 열심히 달려볼 예정입니다
이글을 보고 있는 모두들도 홧팅 !

'[KB IT's Your Life] Today I Learnd' 카테고리의 다른 글
| [KB IT's Your Life] 6주차 컴포넌트 백엔드: 게시판 만들기💡 (3) | 2024.09.02 |
|---|---|
| [KB IT's Your Life] 5주차 컴포넌트 백엔드: Rest 실습 프로젝트💡 (0) | 2024.08.26 |
| [KB IT's Your Life] 4주차 컴포넌트 백엔드: MyBatis실습 프로젝트💡 (0) | 2024.08.18 |
| [KB IT's Your Life] 2주차 컴포넌트 백엔드 💡 (2) | 2024.08.03 |
| [KB IT's Your Life] 1주차 데이터베이스 활용 & 모델링 💡 (1) | 2024.07.27 |