Spring과 Spring Boot
나는 실습을 위해 Spring Boot 프로젝트를 만들어 사용했다.
하지만 스프링이나 스프링부트는 웹 애플리케이션을 만들기 위해 반드시 필요한 유일한 방법은 아니다.
극단적으로 말하면 자바만으로도 웹 애플리케이션을 만들 수 있고,
다른 언어나 다른 프레임워크를 사용해도 웹 서비스는 충분히 구현할 수 있다.
그럼에도 많은 사람들이 스프링과 스프링부트를 사용하는 이유는,
애플리케이션 코드를 더 구조적으로 작성하고 반복 작업을 줄이며,
실무 수준의 웹 애플리케이션을 훨씬 편하게 만들 수 있도록 도와주기 때문이다.
스프링 프레임워크를 설명하는 키워드 3가지
① 의존성 주입 (DI, Dependency Injection)
의존성 주입은 객체가 필요로 하는 다른 객체를 직접 생성해서 사용하는 대신,
외부에서 주입받아 사용하는 방식이다.
이를 통해 객체 간 결합도를 낮추고, 테스트나 유지 보수를 더 쉽게 할 수 있다.
② 제어의 역전 (IoC, Inversion of Control)
일반적으로 개발자가 객체를 만들고 흐름을 직접 제어하지만,
스프링에서는 객체 생성과 관리의 주도권을 프레임워크가 가져간다.
즉, 프로그램의 일부를 개발자가 아닌 스프링이 관리하게 되면서
더 일관되고 유연한 구조를 만들 수 있다.
③ 관점 지향 프로그래밍 (AOP, Aspect-Oriented Programming)
이는 핵심 비지니스 로직과는 별개로 반복적으로 들어가는 공통 관심사,
예를 들어 로깅이나 트랜잭션, 보안 처리를 분리해서 관리할 수 있도록 도와주는 개념이다.
스프링부트
스프링부트는 이러한 스프링 프레임워크를 훨씬 쉽게 사용할 수 있게 만들어준다.
원래 스프링은 강력하지만 설정이 많고 시작 장벽이 있는 편이었다.
스프링부트는 그런 복잡한 설정을 많이 자동화해주고, 기본 내장 서버까지 제공해서
개발자가 빠르게 애플리케이션을 실행해볼 수 있게 해준다.
그래서 스프링부트를 사용하면 별도의 웹 서버 프로그램을 따로 설치하거나 설정하지 않아도,
자바 애플리케이션을 실행하는 것만으로 스프링 기반의 독립적인 웹 애플리케이션을 띄울 수 있다.
여기서 말하는 “그냥 실행한다”는 것은 진짜로 자바 애플리케이션처럼 실행했을 때 웹 서버까지 함께 동작한다는 의미다.
스프링부트 프로젝트의 파일 구조
스프링부트 프로젝트를 시작할 때는 보통 Spring Initializr를 통해 기본 프로젝트를 생성한다.
이 도구를 사용하면 필요한 자바 버전, 빌드 도구, 스프링부트 버전, 의존성을 선택해 바로 프로젝트 뼈대를 만들 수 있다.
① .mvn 폴더
.mvn 폴더는 Maven 빌드 도구와 관련된 파일들이 들어 있는 디렉터리다.
빌드 도구는 단순히 코드를 실행하는 것만이 아니라, 의존성을 내려받고,
프로젝트를 컴파일하고, 패키징하는 작업을 도와준다.
② src 폴더
src 폴더는 실제 개발의 중심이 되는 공간이다.
이 안에는 main과 test가 나뉘어 있는데,
main에는 애플리케이션이 실제로 동작하기 위한 소스 코드가 들어가고,
test에는 이 코드를 검증하기 위한 테스트 코드가 들어간다.
즉, main은 서비스 코드, test는 그 코드가 올바르게 동작하는지 확인하는 공간이라고 이해하면 쉽다.
③ target 폴더
target 폴더는 프로젝트를 빌드하거나 실행한 뒤 생성되는 결과물이 들어가는 곳이다.
자바 소스 파일을 컴파일하면 .class 파일이라는 바이트코드가 만들어지는데,
이런 결과물들이 이 폴더에 생긴다.
뿐만 아니라 Maven이나 Gradle을 이용해 애플리케이션을 실행 가능한 JAR 파일 형태로 패키징했을 때도,
그 파일이 생성되는 위치가 보통 이 폴더다.
즉, target은 사람이 직접 수정하는 폴더라기보다,
프로젝트를 빌드한 결과가 쌓이는 출력 공간이라고 보면 된다.
④ pom.xml
pom.xml은 Maven 프로젝트에서 매우 중요한 설정 파일이다.
여기에 프로젝트 이름과 버전 같은 기본 정보가 들어가고,
어떤 라이브러리를 사용할지에 대한 의존성(dependency) 정보도 작성된다.
예를 들어 웹 개발을 위해 Spring Web을 추가하거나, 데이터베이스 연동을 위해 JPA 관련 라이브러리를 추가하면
그 내용이 이 파일에 반영된다.
결국 pom.xml은 “이 프로젝트가 어떤 설정과 어떤 라이브러리 위에서 동작하는가”를 설명하는 핵심 파일이라고 할 수 있다.
이 구조 안에서 웹 요청을 실제로 받는 대표적인 구성 요소가 바로 컨트롤러(Controller) 다.
컨트롤러는 사용자의 요청이 처음 도달하는 시작점이자, 다시 응답을 돌려주는 끝부분이다.
사용자가 어떤 URL로 요청을 보내면, 그 요청을 어떤 메서드가 처리할지 연결해주는 것이 컨트롤러의 역할이다.
이때 @RequestMapping 같은 어노테이션을 사용하면 특정 경로에 요청이 들어왔을 때 어떤 메서드를 실행할지 매핑할 수 있다.
URL의 구조
웹 애플리케이션을 만들 때는 사용자가 어떤 주소로 접속하는지,
즉 URL의 구조를 이해하는 것도 중요하다.
예를 들어 http://localhost:8080/bye라는 주소를 보면 여러 부분으로 나눌 수 있다.
http는 통신에 사용할 프로토콜(scheme) 이고,
localhost는 서버를 가리키는 호스트(host) 이다.
8080은 해당 서버 안에서 어떤 서비스와 통신할지를 나타내는 포트(port) 이고,
/bye는 서버 안의 어떤 경로에 접근할지를 나타내는 URL path다.
이 구조를 이해하면 브라우저가 어떤 서버의 어떤 기능에 접근하려는지를 더 명확하게 해석할 수 있다.
정적 리소스
스프링부트에서는 이런 요청을 컨트롤러를 통해 처리할 수도 있지만,
모든 응답을 꼭 컨트롤러에서 만들어야 하는 것은 아니다.
특히 내용이 변하지 않는 HTML, CSS, JavaScript, 이미지 같은 파일은
정적 리소스(static resource) 로 제공하는 것이 더 자연스럽고 효율적이다.
예를 들어 사용자에게 단순한 소개 페이지나 고정된 HTML 파일을 보여주고 싶다면,
굳이 컨트롤러 메서드를 작성해서 문자열로 응답하기보다 resources/static 폴더에 해당 파일을 넣어두는 것이 훨씬 편하다.
예를 들어 src/main/resources/static 폴더 안에 backend.html 파일을 넣어두면,
사용자는 localhost:8080/backend.html 주소로 접속해서 그 파일을 바로 볼 수 있다.
즉, 스프링부트는 정적 리소스 폴더에 있는 파일들을 별도의 컨트롤러 없이도 자동으로 제공할 수 있다.
반면 요청에 따라 결과가 달라지는 동적인 응답이 필요하다면,
그때는 컨트롤러나 서비스 로직을 통해 데이터를 처리하고 응답을 만들어야 한다.
결국 웹 애플리케이션에서는 정적인 파일은 정적 리소스로,
요청에 따라 달라지는 결과는 컨트롤러와 비즈니스 로직으로 나누어 생각하면 구조를 이해하기 훨씬 쉬워진다.
'공부 기록 > 이것이 백엔드 개발이다 With Java' 카테고리의 다른 글
| EP8. 웹 브라우저와 서버의 상호작용 (0) | 2026.03.25 |
|---|---|
| EP7. 백엔드 개발자가 HTML을 알아야 하는 이유 (0) | 2026.03.24 |
| EP5. 서버와 서버, 서버와 클라이언트 (0) | 2026.03.20 |
| EP4. 서버와 브라우저 (0) | 2026.03.18 |
| EP3. 서버와 클라이언트의 개념 (0) | 2026.03.16 |