본문 바로가기
백엔드/스프링

[Spring] 자바 스프링 프레임워크 개론

by AI읽어주는남자 2025. 9. 16.
반응형

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. 프로젝트 설정 및 실행

  1. 프로젝트 생성: start.spring.io에서 Gradle, Java, Spring Boot 버전 및 필요한 의존성(Spring Web, MySQL Driver 등)을 선택하여 프로젝트를 생성합니다.
  2. 실행: @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 Created
    • 4xx (클라이언트 오류): 400 Bad Request, 404 Not Found
    • 5xx (서버 오류): 500 Internal Server Error

4.2. 서버 상태 관리: 세션(Session)

  • 정의: 무상태인 HTTP의 단점을 보완하기 위해, 서버 측에서 클라이언트의 상태(데이터)를 일정 기간 저장하고 관리하는 기술.
  • 목적: 로그인 상태 유지, 장바구니, 사용자 설정 등.
  • HttpSession: 서블릿에서 세션을 다루기 위한 객체.
    • .setAttribute(key, value): 세션에 데이터 저장.
    • .getAttribute(key): 세션에서 데이터 조회.
    • .invalidate(): 세션의 모든 데이터 삭제 (로그아웃 시 사용).

4.3. 클라이언트(JavaScript)에서의 통신

  • 동기 vs 비동기: 동기는 작업이 순차적으로 처리되는 방식, 비동기는 여러 작업이 독립적으로 동시에 처리되는 방식. 웹 통신은 주로 비동기로 처리하여 사용자 경험을 향상시킵니다.
  • fetch API: 자바스크립트에 내장된 비동기 HTTP 통신 함수. async/await 문법과 함께 사용하면 동기적인 코드처럼 간결하게 작성할 수 있습니다.

4.4. 파일 업로드 및 다운로드

  • 스트림(Stream): 바이트 단위의 데이터 흐름. 대용량 파일을 처리할 때 사용됩니다.
  • 업로드: 클라이언트의 파일을 서버로 전송.
    • Spring: MultipartFile 인터페이스를 사용하여 첨부 파일을 받습니다.
    • JS: FormData 객체를 사용하여 파일을 포함한 폼 데이터를 fetch로 전송합니다.
    • 파일명 중복 방지: UUID.randomUUID()를 사용하여 고유한 파일명을 생성합니다.
  • 다운로드: 서버의 파일을 클라이언트로 전송.
    • 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 등)를 변수명/함수명으로 사용하면 오류가 발생할 수 있으니 주의해야 합니다.
반응형