본문 바로가기
스프링 부트 3으로 백엔드 입문하기

3장 스프링 부트 3 구조 이해하기

by hoshi03 2023. 11. 21.

• 스프링 부트 3 구조 살펴보기

 

스프링 부트는 각 계층이 양 옆의 계층과 통신하는 구조를 따른다

 

프레젠테이션 계층 <-> 비즈니스 계층 <-> 퍼시스턴스 계층 <-> 데이터베이스

 

각 계층은 서로 소통이 가능하고, 영향을 끼치지는 못한다

 

• 프레젠테이션 계층

 

http 요청을 받고 이 요청을 비즈니스 계층으로 전송한다

컨트롤러가 프레젠테이션 계층의 역할을 한다

 

• 비즈니스 계층

서비스를 만들기 위한 로직인 비즈니스 로직을 처리한다

주문 서비스를 만들때 비즈니스 로직은

1. 주문 개수, 가격 등 데이터 처리 로직

2. 예외처리 로직

3. 주문 받기/ 취소하기 프로세스 로직 

서비스가 비즈니스 계층의 역할을 한다

 

• 퍼시스턴스 계층

DAO 객체 등을 사용해서 db 관련 로직을 처리한다

DAO : 데이터베이스 계층과 상호작용 하기 위한 객체

리포지토리가 퍼시스턴스 계층의 역할을 한다

 

! 위의 계층은 개념적인 영역이고 컨트롤러, 서비스, 리포지토리가 실제 구현의 영역이다

 

• 프로젝트 디렉토리 구성

 국룰? 같은 구조가 있고 그 구조에 맞춰서 개발한다고 한다

 

resources 아래에 templates 폴더를 만들어서 거기다가 html 같은 뷰 관련 파일을 넣는다

js,css, 이미지 같은 정적 파일을 넣을 static 디렉터리 생성

application.yml 파일을 생성한다

application.yml은 스프링 부트 서버가 실행되면 자동으로 로딩되면서 스프링 부트 설정을 한다

디렉토리 구조

 

• 프로젝트 발전시키기

의존성에 jpa, h2, lombok을 추가한다

 

프레젠테이션 계층 만들기

 

@RestController
public class TestController {

    @Autowired
    TestService testService;

    @GetMapping("/test")
    public List<Member> getAllMembers() {
        List<Member> members = testService.getAllMembers();
        return members;
    }
}

 

 컨트롤러 작성

 

 비즈니스 계층 만들기

@Service
public class TestService {
    @Autowired
    MemberRepository memberRepository;

    public List<Member> getAllMembers() {
        return memberRepository.findAll();
    }
}

 

MemberRepository 라는 빈을 주입받은 후 findAll 메서드를 호출해서 저장된 멤버 목록을 모두 가져온다

 

퍼스스턴스 계층 만들기

 

DB 접근 객체인 Member DAO를 작성해서 실제 db에 접근한다

 

@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;
}

 

작동 확인하기

 

현재는 인메모리 db를 사용하고 잇어서 어플리케이션을 실행할때마다 데이터가 사라진다

자동으로 데이터를 넣게 설정해두자

 

resource 디렉터리에 data.sql를 만들고 insert 쿼리 작성

insert into member (id, name) values (1, 'name 1')
insert into member (id, name) values (2, 'name 2')
insert into member (id, name) values (3, 'name 3')

 

yml 파일을 변경해서 어플리케이션 실행하면 쿼리가 실행되게 한다

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    
    # 테이블 생성 후에 sql 실행
    defer-datasource-initialization: true

 

실행하면 테이블이 생성된다

 

스프링을 실행한 후 포스트맨으로 http://localhost:8080/test를 확인해보면 저장한 데이터를

포스트맨 클라이언트에서 확인할 수 있다

[
    {
        "id": 1,
        "name": "name 1"
    },
    {
        "id": 2,
        "name": "name 2"
    },
    {
        "id": 3,
        "name": "name 3"
    }
]

 

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

위의 어플리케이션의 실행 과정은 

1. 포스트맨에서 get /test 요청을 하면

2. 디스패처 서블렛이 url을 분석해서 요청 처리할 컨트롤러를 찾아서 요청 전달

3. 컨트롤러 내의 요청을 처리할 메서드에서 비즈니스와 퍼스스턴스 계층을 통해서 데이터를 가져옴

4. 뷰 리졸버는 템플릿 엔진을 이용해 html, json, xml등을 생성

5. 결과를 리턴

 

 

'스프링 부트 3으로 백엔드 입문하기' 카테고리의 다른 글

6장 API 만들기  (0) 2023.11.23
5장 ORM  (0) 2023.11.22
4장 스프링 부트 3 테스트  (1) 2023.11.22
2장 스프링 부트 3 시작하기  (0) 2023.11.21
1장 스프링 기초 지식  (0) 2023.11.21