반응형
Spring Framework & Web Development 종합 강의노트
이 문서는 웹 개발의 기초부터 Spring Framework의 핵심 원리, 실제 REST API 구현까지의 과정을 유기적으로 정리한 종합 복습 자료입니다.
Part 1: 웹 개발의 기초
웹 애플리케이션 개발을 이해하기 위해 가장 먼저 알아야 할 네트워크와 서버의 기본 개념입니다.
1.1. 네트워크와 통신
- 통신: 매체를 사용하여 정보를 서로 주고받는 과정 (
Request요청,Response응답). - 인터넷: 통신 프로토콜을 이용해 정보를 주고받는 글로벌 통신망.
- 네트워크: 인터넷을 통해 연결된 컴퓨터들의 구조.
- 프로토콜: 네트워크에서 데이터를 원활하게 통신하기 위한 규칙과 절차의 집합. (예: 신호등, 전화번호 체계)
1.2. 핵심 프로토콜
- IP (Internet Protocol): 네트워크에 연결된 각 컴퓨터를 식별하는 고유 번호. (예:
192.168.40.185) - PORT: 하나의 컴퓨터 안에서 실행되는 여러 프로그램(프로세스)들을 식별하는 번호. (예:
8080-Tomcat,3306-MySQL) - DNS (Domain Name Service): 사람이 기억하기 어려운 IP 주소를
www.naver.com과 같은 도메인 이름으로 변환해주는 서비스. - HTTP (HyperText Transfer Protocol): HTML과 같은 텍스트 문서를 웹에서 주고받기 위한 핵심 통신 규약.
- HTTPS: HTTP에 보안(SSL 암호화) 계층을 추가한 프로토콜.
1.3. 웹 서버와 서블릿
- Apache Tomcat: 자바 기반의 웹 애플리케이션(JSP, Servlet)을 실행시켜주는 웹 서버. Spring Boot에는 Tomcat이 내장되어 있습니다.
- Servlet: 자바로 동적인 웹 페이지를 만들기 위한 기술. 클라이언트의 HTTP 요청을 받고, 처리한 후, HTTP 응답을 보내는 역할을 합니다. Spring의
@Controller가 서블릿 기술을 기반으로 동작합니다.
Part 2: Spring Framework 입문
본격적으로 Spring의 개념과 핵심 원리를 알아봅니다.
2.1. Spring이란?
- Spring Framework: 자바 기반의 엔터프라이즈급 애플리케이션 개발을 위한 강력하고 포괄적인 프레임워크.
- Spring Boot: 복잡한 Spring 설정을 자동화하여 개발자가 빠르게 애플리케이션 개발을 시작할 수 있도록 돕는 스타터 프레임워크.
- Gradle: 프로젝트의 의존성(라이브러리)을 관리하고, 빌드 및 배포를 자동화하는 도구.
build.gradle파일에 필요한 라이브러리를 명시하면 자동으로 다운로드 및 설정해줍니다.
2.2. Spring의 핵심 원리: IoC와 DI
- IoC (Inversion of Control, 제어의 역전)
- 정의: 객체의 생성, 관리, 소멸 등 제어권을 개발자가 아닌 Spring 프레임워크(스프링 컨테이너)가 갖는 것.
- 목적: 개발자는 비즈니스 로직에만 집중하고, 객체 관리는 프레임워크에 위임하여 코드의 결합도를 낮추고 재사용성을 높입니다.
- 동작:
@Component,@Controller,@Service등이 붙은 클래스를 스프링 컨테이너가 스캔하여 Bean(객체)으로 등록하고 관리합니다.
- DI (Dependency Injection, 의존성 주입)
- 정의: 필요한 객체(의존성)를 직접 생성하지 않고, 외부(스프링 컨테이너)로부터 주입받는 방식.
- 목적: 클래스 간의 의존 관계를 외부에서 설정하여 결합도를 낮추고, 유연하고 테스트하기 쉬운 코드를 만듭니다.
- 방법:
@Autowired어노테이션을 사용하며, 생성자 주입 방식이 가장 권장됩니다.
2.3. 어노테이션(@)의 역할
- 정의: 코드에 추가적인 정보(메타데이터)를 제공하는 문법. 단순한 주석이 아니라, 컴파일 시점이나 런타임 시점에 특정 기능을 수행하도록 지시합니다.
- 동작 원리: 리플렉션(Reflection) 기술을 사용하여 런타임(실행 중)에 클래스의 메타데이터를 읽어와 동적으로 객체를 조작하고 기능을 실행합니다.
Part 3: Spring Boot로 REST API 만들기
Spring Boot의 핵심 어노테이션과 MVC 패턴을 활용하여 실제 API를 만드는 방법을 알아봅니다.
3.1. 프로젝트 설정 및 실행
- 프로젝트 생성:
start.spring.io에서 Gradle, Java, Spring Boot 버전 및 필요한 의존성(Spring Web, MySQL Driver 등)을 선택하여 프로젝트를 생성합니다. - 실행:
@SpringBootApplication어노테이션이 있는 메인 클래스(AppStart.java)를 실행하면 내장 Tomcat 서버가 구동됩니다.
3.2. MVC 패턴과 계층형 아키텍처
- MVC 패턴: 소프트웨어를
Model,View,Controller세 가지 역할로 구분하는 디자인 패턴. Spring에서는 주로 MVC2 패턴을 기반으로 한 3-Tier 아키텍처를 사용합니다.- View: 사용자에게 보여지는 화면. (JSP, React, HTML/CSS/JS)
- Controller (
@RestController): HTTP 요청/응답 처리, 데이터 유효성 검사, View와 Service 중개. - Service (
@Service): 핵심 비즈니스 로직 처리. (데이터 가공, 연산, 트랜잭션 관리) - Repository/Mapper (
@Repository,@Mapper): 데이터베이스와 직접 통신하여 데이터를 저장하고 조회(CRUD)하는 역할. (DAO, JPA, MyBatis)
3.3. 핵심 Spring 어노테이션
@SpringBootApplication: 스프링 부트의 자동 설정, Bean 스캔 등을 활성화하는 핵심 어노테이션.@RestController:@Controller+@ResponseBody가 합쳐진 형태로, 주로 JSON 형태의 데이터를 반환하는 REST API를 만들 때 사용.@RequestMapping,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping: 특정 URL과 HTTP Method를 컨트롤러의 메소드와 매핑(연결).@RequestParam: URL의 쿼리스트링(?key=value)을 파라미터로 받을 때 사용.@RequestBody: HTTP 요청의 본문(Body)에 담긴 JSON 데이터를 자바 객체(DTO)로 변환할 때 사용.
3.4. Lombok으로 코드 다이어트
- Lombok: 반복적인
Getter,Setter,생성자,ToString등의 코드를 어노테이션 하나로 자동 생성해주는 라이브러리.@Getter,@Setter: 필드의 Getter/Setter 메소드 생성.@ToString: 객체 출력 시 주소값 대신 필드값을 보여주도록toString()메소드 오버라이딩.@NoArgsConstructor: 기본 생성자 생성.@AllArgsConstructor: 모든 필드를 포함하는 생성자 생성.
Part 4: HTTP 심화와 클라이언트-서버 통신
서버와 클라이언트가 어떻게 데이터를 주고받는지 HTTP와 통신 기술을 더 깊게 알아봅니다.
4.1. HTTP 상세
- 특징: 무상태(Stateless) 프로토콜. 각 통신은 독립적이며 이전의 상태를 기억하지 않습니다.
- HTTP Method: 자원(Resource)에 대한 행동(Verb)을 정의.
POST: 생성 (Create)GET: 조회 (Read)PUT: 전체 수정 (Update)DELETE: 삭제 (Delete)
- HTTP Content-Type: 요청/응답 본문의 데이터 형식을 명시. (예:
application/json,text/html,multipart/form-data) - HTTP Status Codes: 서버의 응답 상태를 나타내는 세 자리 숫자.
2xx(성공):200 OK,201 Created4xx(클라이언트 오류):400 Bad Request,404 Not Found5xx(서버 오류):500 Internal Server Error
4.2. 서버 상태 관리: 세션(Session)
- 정의: 무상태인 HTTP의 단점을 보완하기 위해, 서버 측에서 클라이언트의 상태(데이터)를 일정 기간 저장하고 관리하는 기술.
- 목적: 로그인 상태 유지, 장바구니, 사용자 설정 등.
HttpSession: 서블릿에서 세션을 다루기 위한 객체..setAttribute(key, value): 세션에 데이터 저장..getAttribute(key): 세션에서 데이터 조회..invalidate(): 세션의 모든 데이터 삭제 (로그아웃 시 사용).
4.3. 클라이언트(JavaScript)에서의 통신
- 동기 vs 비동기: 동기는 작업이 순차적으로 처리되는 방식, 비동기는 여러 작업이 독립적으로 동시에 처리되는 방식. 웹 통신은 주로 비동기로 처리하여 사용자 경험을 향상시킵니다.
fetchAPI: 자바스크립트에 내장된 비동기 HTTP 통신 함수.async/await문법과 함께 사용하면 동기적인 코드처럼 간결하게 작성할 수 있습니다.
4.4. 파일 업로드 및 다운로드
- 스트림(Stream): 바이트 단위의 데이터 흐름. 대용량 파일을 처리할 때 사용됩니다.
- 업로드: 클라이언트의 파일을 서버로 전송.
- Spring:
MultipartFile인터페이스를 사용하여 첨부 파일을 받습니다. - JS:
FormData객체를 사용하여 파일을 포함한 폼 데이터를fetch로 전송합니다. - 파일명 중복 방지:
UUID.randomUUID()를 사용하여 고유한 파일명을 생성합니다.
- Spring:
- 다운로드: 서버의 파일을 클라이언트로 전송.
FileInputStream으로 서버의 파일을 읽고,ServletOutputStream으로 클라이언트에게 응답 스트림을 보냅니다.response.setHeader("Content-Disposition", "attachment;filename=...")헤더를 설정하여 브라우저가 파일을 다운로드하도록 합니다.
Part 5: 템플릿과 고급 문법
5.1. 정적 파일 vs 동적 파일
- 정적 파일: 내용이 변하지 않는 파일 (HTML, CSS, JS, 이미지). Spring Boot에서는
src/main/resources/static폴더에 위치시킵니다. - 동적 파일: 서버에서 데이터 처리 후 그 결과에 따라 내용이 바뀌는 파일 (JSP, Thymeleaf). JSP는
src/main/webapp폴더에 위치시킵니다.
5.2. Java & JavaScript 람다식/반복문
- 람다식(화살표 함수): 메소드(함수)를 더 간결하게 표현하는 문법.
(매개변수) -> { 실행문 }형태로 사용됩니다. - 모던 반복문:
forEach,map,filter등은 컬렉션 데이터를 더 선언적이고 효율적으로 처리하는 데 도움을 줍니다.
Part 6: 부록: 자주 발생하는 오류와 해결
Port 8080 was already in use: 다른 스프링 서버가 이미 실행 중일 때 발생. 기존 프로세스를 종료해야 합니다. (taskkill명령어 사용)- 프론트엔드 변경 미반영: 브라우저 캐시 문제일 수 있으므로
Ctrl + Shift + R로 강력 새로고침을 시도합니다. - 경로 설정 오류: JSP나 fetch에서 파일/API 경로가 잘못 지정된 경우. 절대 경로(
/)와 상대 경로의 차이를 이해하고 정확히 사용해야 합니다. - JS 키워드 오류: 자바스크립트의 예약어(let, class 등)를 변수명/함수명으로 사용하면 오류가 발생할 수 있으니 주의해야 합니다.
반응형
'백엔드 > 스프링' 카테고리의 다른 글
| [Spring] 5장: Spring Security를 이용한 인증과 인가 (0) | 2025.09.18 |
|---|---|
| [Spring] 4장: JPA와 Spring Data JPA로의 도약 (0) | 2025.09.18 |
| [Spring] 3장: MyBatis를 이용한 데이터베이스 연동 (0) | 2025.09.18 |
| [Spring] 2장: Spring MVC와 웹 요청 처리 (0) | 2025.09.18 |
| [Spring] 1장: Spring Boot와 제어의 역전(IoC) / 의존성 주입(DI) (0) | 2025.09.18 |
| [Spring] Spring Boot 로드맵: 실무 역량을 갖춘 백엔드 개발자로 거듭나기 (0) | 2025.09.18 |
| [Spring] WebSocket 요약 정리 (0) | 2025.09.15 |
| [Spring] MyBatis 어노테이션 기반 문법 (0) | 2025.09.15 |