SpringBoot

스프링부트 3백앤드 개발자 되기 : 자바 편 3장 정리 (스프링부트3 구조 이해 )

나는주민 2025. 2. 14. 15:13

도서 저자분의 깃허브 주소 (chap 3)   : https://github.com/shinsunyoung/springboot-developer/tree/main/chapter3



1. 프레젠테이션 계층 (Presentation Layer):

  • 역할: 사용자와의 상호작용을 담당하는 계층으로, 주로 HTTP 요청과 응답을 처리합니다.
  • 구성 요소: @RestController, @Controller, @RequestMapping 등.
  • 기능: 클라이언트로부터 요청을 받고, 이를 적절히 처리한 후 응답을 반환하는 역할을 합니다. API에서 데이터를 요청하고 반환하는 로직이 여기에 포함됩니다.

2. 비즈니스 계층 (Business Layer):

  • 역할: 애플리케이션의 핵심 비즈니스 로직을 처리하는 계층입니다.
  • 구성 요소: 서비스 클래스 (@Service 어노테이션 사용).
  • 기능: 애플리케이션의 주요 기능을 처리하며, 데이터 처리나 다른 비즈니스 로직을 수행합니다. 예를 들어, 주문 처리, 결제 처리, 사용자 인증 등의 로직이 이 계층에 해당합니다.

3. 퍼시스턴스 계층 (Persistence Layer):

  • 역할: 데이터베이스와의 상호작용을 담당하는 계층으로, 데이터의 저장과 검색을 처리합니다. ( DAO 객체를 사용가능)
  • 구성 요소: 리포지토리 클래스 (@Repository 어노테이션 사용), JpaRepository, CrudRepository 등.
     

2) 스프링 부트 프로젝트 디렉터리 구성하며 살펴보기 

 

  • static:
    • 정적 리소스(이미지, CSS, JavaScript 파일 등)를 저장하는 디렉토리입니다.
    • 이곳에 있는 파일들은 HTTP 요청을 통해 클라이언트에서 직접 접근할 수 있습니다. 예를 들어, /static/css/style.css와 같은 URL로 접근 가능합니다.
  • templates:
    • 서버 사이드에서 처리될 HTML 템플릿 파일들을 저장하는 곳입니다.
    • Spring Boot에서는 Thymeleaf, FreeMarker 등의 템플릿 엔진을 사용하여 동적 HTML을 생성할 수 있습니다. 예를 들어, /templates/index.html 파일이 뷰 템플릿으로 사용될 수 있습니다.
  • application.yml:
    • Spring Boot 애플리케이션의 설정 파일입니다.
    • 애플리케이션의 환경 설정, 데이터베이스 연결 정보, 서버 포트, 로깅 설정 등을 포함합니다. application.properties 파일과 비슷한 역할을 하지만 YAML 형식으로 작성됩니다.


3) JAP 스프링 데이터 , JPA, 로컬 환경과 테스트 환경에서 사용할 인메모리 데이터베이스인 h2 , Lombok  사용을 위한 의존성주
입 

build.gradle 을 아래처럼 작성하자 !

//build.gradle

plugins {
    // Java 플러그인 사용 (Java 프로젝트를 빌드하는 데 필요)
    id 'java'
    
    // Spring Boot 플러그인 (Spring Boot 애플리케이션을 실행하고 패키징하는 데 사용)
    id 'org.springframework.boot' version '3.0.2'
    
    // 의존성 관리 플러그인 (Spring 의존성 관리를 위한 플러그인)
    id 'io.spring.dependency-management' version '1.1.0'
}

group 'me.shinsunyoung'  // 프로젝트의 그룹 ID (보통 조직명이나 도메인명)
version '1.0'  // 프로젝트 버전
sourceCompatibility = '17'  // Java 17 버전으로 컴파일

repositories {
    // Maven 중앙 저장소에서 의존성 다운로드
    mavenCentral()
}

dependencies {
    // Spring Boot 웹 애플리케이션을 위한 의존성 (서블릿, RESTful API 등)
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    // Spring Data JPA (데이터베이스 연동을 위한 의존성)
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    // H2 데이터베이스 의존성 (런타임 시 H2 데이터베이스를 사용, 메모리 내 DB)
    runtimeOnly 'com.h2database:h2'

    // Lombok 의존성 (롬복은 컴파일 타임에 코드 생성해주는 라이브러리로 getter, setter 등을 자동으로 생성)
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'  // Lombok을 사용할 때 필요한 어노테이션 프로세서

    // Spring Boot 테스트 의존성 (단위 테스트를 위한 라이브러리)
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    // JUnit 플랫폼을 사용하여 테스트 실행 (JUnit 5 이상을 사용)
    useJUnitPlatform()
}





1) TestController.java 작성 

package me.shinsunyoung.springbootdeveloper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

// @RestController 어노테이션은 해당 클래스가 REST API의 엔드포인트로 사용된다는 것을 나타냄
@RestController
public class TestController {

    // TestService를 주입받기 위한 @Autowired 어노테이션
    @Autowired
    TestService testService;

    // "/test" 경로로 GET 요청을 받을 때 호출되는 메소드
    @GetMapping("/test")
    public List<Member> getAllMembers() {
        // TestService의 getAllMembers() 메소드를 호출하여 모든 회원 정보를 가져옴
        List<Member> members = testService.getAllMembers();
        
        // 가져온 회원 정보를 반환
        return members;
    }
}



2) TestService 작성 

package me.shinsunyoung.springbootdeveloper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

// @Service 어노테이션은 해당 클래스가 서비스 컴포넌트임을 나타냄
// 주로 비즈니스 로직을 처리하는 클래스에 사용
@Service
public class TestService {
    
    // MemberRepository를 자동으로 주입받기 위한 @Autowired 어노테이션
    @Autowired
    MemberRepository memberRepository;

    // 모든 회원 정보를 반환하는 메소드
    public List<Member> getAllMembers() {
        // memberRepository에서 모든 회원 데이터를 가져옴
        return memberRepository.findAll();
    }
}



1) MemberRepository라는 빈을 주입받는다. 2) findAll() 메서드를 호출해 맴버 테이블에 저장된 맴버 목록을 가져


                                               어노테이션들을 각 컴포넌트마다 잘 작성해야하는 이유


 

 


1. 요청(Request) 처리

🔹 클라이언트(브라우저, API 요청 등)가 HTTP 요청을 보냄
🔹 톰캣(서블릿 컨테이너)이 요청을 받아 스프링 MVC의 DispatcherServlet에 전달

2. 컨트롤러 호출 및 비즈니스 로직 실행

🔹 DispatcherServlet이 요청을 분석 후, 해당하는 Controller의 메서드 실행
🔹 서비스(Service) → 리포지토리(Repository) 순서로 로직 처리

3. 응답(Response) 반환

🔹 컨트롤러가 처리 결과를 반환하면, DispatcherServlet이 이를 HTTP 응답으로 변환
🔹 톰캣이 최종적으로 클라이언트에게 응답 전송

📌 정리: 톰캣은 요청을 받아 스프링에게 전달하고, 응답을 클라이언트에게 보내는 역할을 한다. 🚀