Spring Legacy 공부 정리

이웅·2026년 9월 6일

Spring Legacy를 공부하면서 가장 먼저 이해하려고 했던 것은 단순히 Controller나 Annotation을 사용하는 방법이 아니라,

사용자가 요청을 보냈을 때 Spring에서는 어떤 일이 일어나고, 최종적으로 어떤 과정을 거쳐 응답이 돌아오는가?

였다.

처음에는 Controller에 메서드를 만들고 JSP를 연결하면 화면이 나오는 정도로 생각했지만, 공부하면서 그 사이에 Tomcat, DispatcherServlet, Controller, Service, View(JSP) 등이 각각 역할을 가지고 있다는 것을 알게 되었다.

이번 글에서는 Spring Legacy에서 배운 내용을 바탕으로 Request → Spring → Controller → JSP → Response의 전체적인 흐름을 정리해보려고 한다.


1. Spring Legacy란?

먼저 내가 학원에서 사용한 Spring Legacy는 일반적으로 Spring Framework 기반의 웹 애플리케이션을 구성하는 방식이다.

Spring Boot와 비교하면 설정해야 할 부분이 더 많고 XML 설정도 많이 사용한다.

대표적인 구조를 간단하게 표현하면 다음과 같다.

Client
↓
Tomcat
↓
DispatcherServlet
↓
Controller
↓
Service
↓
DAO
↓
Database

그리고 처리된 결과는 다시 반대 방향으로 전달된다.

Database
↓
DAO
↓
Service
↓
Controller
↓
View (JSP)
↓
Response
↓
Client

처음에는 이 구조가 복잡하게 느껴졌지만, 각각의 역할을 나누어서 생각하니 조금씩 이해할 수 있었다.


2. Request와 Response

웹 개발을 이해하려면 먼저 Request와 Response를 이해해야 한다.

사용자가 웹 브라우저에서 어떤 URL에 접속한다고 생각해보자.

http://localhost:8080/member/list

브라우저는 서버에게 요청을 보낸다.

이것이 Request이다.

Client
↓
Request
↓
Server

서버는 요청을 처리한 뒤 결과를 다시 브라우저에게 전달한다.

이것이 Response이다.

Server
↓
Response
↓
Client

결국 웹의 기본적인 흐름은

Request → 서버의 처리 → Response

라고 볼 수 있다.


3. Tomcat의 역할

Spring Legacy를 공부하면서 Tomcat도 함께 사용했다.

Tomcat은 웹 애플리케이션을 실행하고 HTTP 요청을 받아 처리할 수 있도록 해주는 Servlet Container이다.

쉽게 생각하면

Tomcat은 Spring 웹 애플리케이션이 실행될 수 있는 환경을 제공하고 HTTP 요청을 받아 Servlet에게 전달하는 역할을 한다.

라고 이해했다.

예를 들어 사용자가

/member/list

로 요청을 보내면 Tomcat이 요청을 받아 웹 애플리케이션으로 전달한다.

그다음 Spring의 핵심 역할을 하는 DispatcherServlet이 요청을 처리한다.


4. DispatcherServlet

Spring MVC를 공부하면서 가장 중요했던 개념 중 하나가 DispatcherServlet이었다.

DispatcherServlet은 Spring MVC에서 들어오는 요청을 처음 받아 적절한 Controller로 전달하는 Front Controller 역할을 한다.

전체적인 흐름은 다음과 같다.

Client
↓
Tomcat
↓
DispatcherServlet
↓
Controller

예를 들어

GET /member/list

라는 요청이 들어왔다고 해보자.

DispatcherServlet은 이 요청을 처리할 적절한 Controller와 메서드를 찾아서 실행하도록 한다.

즉,

DispatcherServlet은 요청을 직접 비즈니스 로직으로 처리하는 것이 아니라, 적절한 Controller에게 요청을 전달하는 역할을 한다.

라고 이해했다.


5. Controller

Controller는 클라이언트의 요청을 받아서 적절한 처리를 수행하고 결과를 반환하는 역할을 한다.

예를 들어 다음과 같은 Controller가 있을 수 있다.

@Controller
public class MemberController {

@RequestMapping("/member/list")
public String memberList() {

    return "member/list";
}

}

사용자가

/member/list

로 요청하면 해당 메서드가 실행된다.

그리고

return "member/list";

를 반환한다.

이때 반환값은 단순한 문자열이라기보다 어떤 View를 보여줄 것인지 나타내는 값으로 사용할 수 있다.


6. JSP는 View 역할을 한다

Spring MVC에서는 Controller가 모든 화면을 직접 만드는 것이 아니라 View에게 화면 출력을 맡길 수 있다.

Spring Legacy에서 JSP를 사용한다면 JSP가 View 역할을 한다.

예를 들어 Controller에서

return "member/list";

를 반환했다고 하자.

설정에 따라 Spring은 해당 이름을 이용해서 JSP 파일을 찾는다.

WEB-INF
└── views
└── member
└── list.jsp

그리고 JSP에서 HTML을 생성하여 최종적으로 클라이언트에게 전달한다.

전체 흐름을 보면

Request
↓
DispatcherServlet
↓
Controller
↓
View 이름 반환
↓
JSP
↓
HTML
↓
Response
↓
Browser

가 된다.


7. JSP에서 동적인 화면 만들기

JSP를 공부하면서 단순한 HTML 파일과 JSP의 차이도 알게 되었다.

HTML은 기본적으로 정적인 문서를 작성하는 데 사용하지만 JSP는 서버에서 처리된 데이터를 화면에 출력하는 데 사용할 수 있다.

예를 들어 Controller에서 데이터를 전달할 수 있다.

@RequestMapping("/member")
public String member(Model model) {

model.addAttribute("name", "홍길동");

return "member";

}

그러면 JSP에서 전달받은 데이터를 사용할 수 있다.

${name}

결과적으로 브라우저에는

홍길동

이 출력된다.

즉,

Controller
↓
Model에 데이터 저장
↓
JSP
↓
데이터 출력

이라는 흐름으로 동작한다.


8. Annotation

Spring을 공부하면서 자주 접하게 된 것이 Annotation이었다.

Annotation은 코드에 특정 정보를 표시하기 위해 사용하는 문법이다.

Spring에서는 Annotation을 이용해서 클래스나 메서드의 역할을 Spring에게 알려줄 수 있다.

대표적인 Annotation으로 다음과 같은 것들이 있다.

@Controller
@Service
@Repository
@Component
@RequestMapping
@GetMapping
@PostMapping
@Autowired

예를 들어

@Controller
public class MemberController {
}

라고 작성하면 Spring에게

"이 클래스는 Controller 역할을 하는 클래스야."

라고 알려주는 것이다.


9. Component란?

Spring을 공부하면서 @Component도 중요하게 배웠다.

@Component
public class Member {
}

이렇게 작성하면 Spring이 해당 클래스를 Spring Bean으로 관리할 수 있도록 등록한다.

그리고 @Controller, @Service, @Repository도 결국 @Component와 관련된 Annotation이다.

대표적으로 다음과 같이 볼 수 있다.

@Component
├── @Controller
├── @Service
└── @Repository

각 Annotation은 역할에 맞게 사용한다.

@Controller
→ Controller 역할

@Service
→ Service 역할

@Repository
→ Repository 역할

즉, Spring은 Annotation을 이용해서 객체의 역할을 파악하고 관리할 수 있다.


10. IoC(제어의 역전)

Spring을 공부하면서 가장 중요했던 개념 중 하나가 IoC(Inversion of Control), 제어의 역전​이었다.

처음에는 "제어의 역전"이라는 말 자체가 어렵게 느껴졌다.

하지만 핵심은 생각보다 단순했다.

일반적으로 Java에서는 개발자가 직접 객체를 생성하고 관리한다.

MemberService service = new MemberService();

개발자가 직접

객체 생성
↓
객체 관리
↓
객체 사용

을 하는 것이다.

하지만 Spring에서는 객체의 생성과 관리를 Spring Container가 담당한다.

Spring Container
↓
객체 생성
↓
Bean 관리
↓
필요한 곳에 주입

즉,

객체를 직접 생성하고 관리하던 제어권이 개발자에서 Spring Container로 넘어가는 것

을 IoC라고 이해했다.


11. DI와 IoC의 관계

IoC를 공부하다 보면 DI(Dependency Injection)​도 함께 등장한다.

예를 들어 Controller가 Service를 필요로 한다고 해보자.

@Controller
public class MemberController {

@Autowired
private MemberService memberService;

}

Controller가 직접

new MemberService()

를 하지 않는다.

Spring이 관리하고 있는 MemberService 객체를 필요한 곳에 주입해준다.

Spring Container
↓
MemberService 생성 및 관리
↓
Controller에 주입

이것이 DI(의존성 주입)​이다.

따라서 내가 이해한 관계는

IoC
└── 객체의 생성과 관리에 대한 제어권을 Spring이 가짐

DI
└── Spring이 필요한 객체를 주입해줌

이라고 정리할 수 있다.


12. Spring Container와 Bean

IoC를 이해하기 위해서는 Bean도 함께 알아야 한다.

Spring Container는 객체를 생성하고 관리한다.

이때 Spring Container가 관리하는 객체를 Bean이라고 한다.

예를 들어

@Service
public class MemberService {
}

라고 작성하면 Spring이 해당 클래스를 Bean으로 등록하고 관리할 수 있다.

결국

@Service
↓
Spring Container에 Bean 등록
↓
Spring이 객체 생성 및 관리

라는 흐름이 만들어진다.


13. 전체 Request → Response 흐름

지금까지 배운 내용을 하나로 연결하면 Spring MVC의 전체 흐름을 이해할 수 있다.

사용자가 브라우저에서 요청한다.

GET /member/list
① Client

브라우저가 HTTP Request를 보낸다.

Browser
↓
Request
② Tomcat

Tomcat이 HTTP 요청을 받는다.

Browser
↓
Tomcat
③ DispatcherServlet

Spring의 DispatcherServlet이 요청을 전달받는다.

Tomcat
↓
DispatcherServlet
④ Controller

DispatcherServlet이 적절한 Controller를 찾아 요청을 전달한다.

DispatcherServlet
↓
MemberController
⑤ Service

Controller가 필요한 비즈니스 로직을 Service에게 요청한다.

Controller
↓
Service
⑥ DAO / Repository

필요하다면 DB 작업을 수행한다.

Service
↓
DAO
↓
Database
⑦ 결과 반환

DB에서 조회한 결과가 다시 위로 올라온다.

Database
↑
DAO
↑
Service
↑
Controller
⑧ View

Controller가 View 이름을 반환하면 Spring이 해당 JSP를 찾는다.

Controller
↓
View
↓
JSP
⑨ Response

JSP에서 생성된 HTML이 브라우저로 전달된다.

JSP
↓
Response
↓
Browser

전체 과정을 하나로 표현하면 다음과 같다.

┌──────────┐
│ Client │
└────┬─────┘
│ Request
↓
┌──────────┐
│ Tomcat │
└────┬─────┘
↓
┌──────────────────┐
│ DispatcherServlet│
└────┬─────────────┘
↓
┌──────────────┐
│ Controller │
└────┬─────────┘
↓
┌──────────────┐
│ Service │
└────┬─────────┘
↓
┌──────────────┐
│ DAO / Mapper │
└────┬─────────┘
↓
┌──────────────┐
│ Database │
└────┬─────────┘
│
↓
결과 반환
↓
Controller
↓
View
↓
JSP
↓
Response
↓
Client


14. 이번에 공부하면서 가장 중요했던 것

처음 Spring을 공부할 때는

@Controller
@RequestMapping
@Autowired
@Service

같은 Annotation을 단순히 외우려고 했다.

하지만 각각의 Annotation을 외우는 것보다 중요한 것은

"이 Annotation이 붙으면 Spring 내부에서 어떤 역할을 하는가?"

를 이해하는 것이라고 생각한다.

예를 들어

@Controller

를 보면 단순히 "Controller Annotation"이라고 외우는 것보다

@Controller
↓
Spring이 Controller 역할의 Bean으로 인식
↓
요청을 처리할 Controller로 사용

라고 이해하는 것이 더 중요하다고 느꼈다.

마찬가지로

@Service

도

@Service
↓
Spring Bean 등록
↓
Service 역할의 객체로 관리

라는 흐름으로 이해할 수 있다.

마무리

이번 Spring Legacy 공부에서 가장 크게 느낀 점은 Spring을 단순히 Annotation을 사용하는 기술로 이해하면 안 된다는 것이었다.

처음에는

@Controller
@Autowired
@Service

등을 그냥 문법처럼 외우려고 했지만,

결국 중요한 것은

Request
↓
Tomcat
↓
DispatcherServlet
↓
Controller
↓
Service
↓
DAO
↓
Database
↓
Controller
↓
JSP
↓
Response

라는 전체적인 흐름을 이해하는 것이었다.

그리고 이 과정에서 Spring Container가 객체를 생성하고 관리하고, 필요한 객체를 주입해주는 IoC와 DI의 개념도 자연스럽게 연결할 수 있었다.

앞으로 Spring을 더 공부하면서 단순히 코드를 따라 치는 것보다,
"이 코드가 왜 필요한지", "Spring이 내부적으로 어떤 역할을 하는지"
를 생각하며 공부해야겠다.

profile
안녕하세요 이웅입니다.

0개의 댓글