Super Kawaii Cute Cat Kaoani
본문 바로가기
⚙️ Back-end/SpringBoot

Springboot [3] : 스프링부트 구조 이해하기

by wonee1 2024. 3. 4.
728x90

* 책 스프링부트 3 백엔드 개발자 되기 자바편을 공부하면서 정리한 내용입니다
 
스프링부트는 각 계층이 양 옆의 계층과 통신하는 구조를 따른다 .
 
 

스프링부트 구조 

 
프레젠테이션 계층(컨트롤러)
 

  • HTTP 요청을 받고 이 요청을 비즈니스 계층으로 전송하는 역할을 한다. 
  • 컨트롤러가 이 역할을 한다. (컨트롤러는 스프링 부트 내에 여러 개가 있을 수 있다) 

 
비즈니스 계층(서비스)

  • 비즈니스 로직이란 서비스를 만들기 위한 로직을 말한다.
  • 프로세스를 구현하기 위한 로직 

 
 
퍼시스턴스 계층(리포지토리)
 

  • 데이터베이스 관련 로직을 처리. 
  • DAO 객체를 사용할 수도 있다. 

 
계층은 개념의 영역이고, 컨트롤러 서비스 리포지토리는 실제 구현을 위한 영역이다. 
 
 

스프링부트 프로젝트 디렉터리 구성 

 
 
 
main
실제 코드르 작성하는 공간 프로젝트 실행에 필요한 소스 코드나 리소스 파일
 
test
프로젝트의 소스 코드를 테스할 목적의 코드나 리소스 파일
 
build.gradle
빌드를 설정하는 파일, 의존성이나 플러그인 설정 등과 같이 빌드에 필요한 설정을 할 때 사용
 
settings.gradle
빌드할 프로젝트의 정보를 설정하는 파일 
 
 
 

main 디렉터리 구성

 

 
templates 
HTML과 같은 뷰 관련 파일을 넣을 디렉터리
 
static 
JS,CSS,이미지와 같은 정적 파일을 넣을 디렉터리 
 
application.yml 
스프링 부트 설정을 할 수 있는 파일 
스프링 부트 서버가 실행되면 자동으로 로딩되는 파일 
 


 

build.gradle에 의존성 추가하기  

 
 

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'


    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

}

 
 
스프링 부트용 JPA인 스프링데이터 JPA
로컬 환경과 테스트 환경에서 사용할 인메모리 데이터베이스 H2
반복 메서트 작성 작업을 줄여주는 라이브러리인 롬복 추가 
 

프레젠테이션, 서비스,퍼시스턴스 계층만들기

 
 
1. 프레젠테이션 계층에 속하는 컨트롤러 관련 코드 작성

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

import java.lang.reflect.Member;

@RestController
public class TestController {

    @Autowired
    TestService testService;
    @GetMapping("/test")

    public List<Member> getAllMembers() {
        List<Member> members = testService.getAllMembers();
        return members;
    }
}

TestController.java
 
 
 
2. 비즈니스 계층 코드 작성 

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

@Service
public class TestService {

    @Autowired
    MemberRepository memberRepository;

    public List<Member> getAllMembers(){

        return memberRepository.findAll();
    }

}

TestService.java
 
 
 
3. 퍼시스턴트 계층 코드 작성 
 

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access= AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

}

Member.java
*member라는 이름의 테이블에 접근하는 데 사용할 객체다
 
 
4. 매핑 작업 
 
매핑작업에는 인터페이스 파일이 필요, 따라서 MemberRepository.java 인터페이스 파일을 새로 생성.
 

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
    
}

 
MemberRepository.java
 
이 인터페이스는 DB에서 데이터를 가져오는 퍼시스턴트 계층역할을 한다. 
실제로 member 테이블과 Member 클래스를 매핑하는 코드다.
 
 
 
 

작동확인 

 
 
 
 

 

스프링부트 요청-응답 과정 

 
1. 포스트맨에서 톰캣에 /test GET 요청 (요청은 스프링부트 내로 이동)
 
2.스프링 부트의 디스패처 서블릿이 URL을 분석하며 이 요청을 처리 할 수 있는 컨트롤러를 찾음
*TestController가 /test라는 패스에 대한 GET 요청을 처리할 수 있는 getAllMembers() 메서드를 가지고 있음
따라서 디스패치 서블릿은 TestController에 /test GET요청 전달.
 
3. getAllMembers() 메서드는 비즈니스 계층과 퍼시스턴스 계층을 통하면서 필요한 데이터를 가져옴
 
4. 뷰 리졸버는 템플릿 엔진을 사용해 HTML,JSON,XML 등의 데이터를 생성
 
5. members를 return하고 그 데이터를 포스트맨에서 볼 수 있음
 
 
 

728x90