백엔드

[스프링부트3] 03장_스프링부트3 구조 이해하기

콩지연 2023. 6. 25. 23:01
1. 스프링부트3 구조 살펴보기

 

1. 계층 이해하기

프레젠테이션 계층

HTTP요청을 받고 요청을 비지니스계층을 전송하는 역할 > 컨트롤러가 프레젠테이션 계층의 역할을 하는 클래스

 

비지니스 계층

서비스를 만들기 위한 로직, 즉 모든 비지니스 로직을 처리하는 계층

 

퍼시스턴스 계층

모든 데이터베이스 관련 로직을 처리, 리포지토리는 퍼시스턴스계층의 역할을 하는 클래스

 

 

2. 디렉터리 살펴보기

main

실제 코드를 작성하는 공간

 

- 1) java

프레젠테이션, 비지니스, 퍼시스턴스 계층의 코드를 담은 곳

 

- 2) resources

js, css, 이미지 등 정적 파일을 넣을 static 디렉터리

스프링부트 설정(DB 설정, 로깅 설정)을 담은 application.yml 파일 > 스프링부트가 실행되면 자동으로 로딩된다.

 

test

프로젝트의 소스코드를 테스트할 목적의 코드나 리소스 파일을 담은 곳

 

build.gradle

빌드를 설정하는 파일 > 의존성이나 플러그인 설정 등 빌드에 필요한 설정을 할 때 사용

 

setting.gradle

빌드할 프로젝트 정보를 설정하는 파일

 

 

 

2. 스프링부트3 프로젝트 발전시키기

 

1. 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'  //스프링 데이터 jpa
    runtimeOnly 'com.h2database:h2:'                //인메모리 데이터베이스
    compileOnly 'org.projectlombok:lombok'          //롬복
    annotationProcessor 'org.projectlombok:lombok'
}

 

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

1단계 : 프레젠테이션 계층 만들기 > TestController.java

@RestController
public class TestController {

    @Autowired	//testService의존성 주입
    TestService testService;

    @GetMapping("/test")
    public List<Member> test(){	  //testService의 매서드 호출
        List<Member> members = testService.getAllMembers();
        return members;
    }
}

 

2단계 :  비즈니스 계층 > TestService.java

@Service
public class TestService {

    @Autowired	//MemberRepository의존성 주입
    MemberRepository memberRepository;

    public List<Member> getAllMembers(){
        return memberRepository.findAll();  //memberRepository매서드 호출
    }
}

 

3단계 : 퍼시스턴트계층  > Member.java 

DB에 접근할 때 사용할 객체인 DAO 클래스 > member라는 이름의 테이블에 접근할 때 사용할 객체

@NoArgsConstructor(access= AccessLevel.PROTECTED)   //기본 생성자
@AllArgsConstructor
@Getter
@Entity 
public class Member {

    @Id //기본 키로 지정
    @GeneratedValue(strategy= GenerationType.IDENTITY)  //기본키 자동으로 1씩 증가
    @Column(name="id", updatable=false)
    private Long id;

    @Column(name="name", nullable=false)    //name이라는 not null 컬럼과 매핑
    private String name;
}

 

4단계 : 퍼시스턴스 계층 > MemberRepository.java

DB에서 데이터를 가져오는 퍼시스턴스 계층 역할 > member라는 테이블에 접근해 Member클래스에 매핑하는 구현체

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

 

 

3. 작동 확인하기

- 인메모리 데이터베이스를 사용하고 있기에 애플리케이션을 새로 실행할 때마다 데이터가 사라진다.

 

1단계 : 애플리케이션이 실행될 때 저장할 데이터를 넣은 SQL파일 생성 > data.sql

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

 

2단계 : application.yml 변경 (p.82)

spring:
    jpa:

      #전송쿼리 확인
      show-sql : true
      properties:
        hibernate:
          format_sql: ture

      # 테이블 생성 후 data.sql 실행
      defer-datasource-initialization: true

 

3단계 : 요청 실행

포스트맨 실행 > http://localhost:8080/test > send > 결과 확인

 

 


 

<스프링부트 요청 - 응답 한 번에 이해하기>

 

1. 톰캣에 get 요청

2. 스프링부트로 이동 > 디스패처서블릿이 url분석 > 컨트롤러에 요청 전달

3. testController > testService > memberRepository > DB 순서로 데이터 가져오기

4. 뷰 리졸버는 템플릿 엔진을 사용해 HTML문서를 만들거나 JSON, XML등의 데이터 생성

5. testController 매서드의 결과 값을 return하고 데이터를 포스트맨에서 확인 가능