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

Ogu·2024년 1월 2일
1

스프링부트의 계층 구조

각 계층은 서로 영향을 끼치지 못함

프레젠테이션 계층

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

비즈니스 계층

모든 비즈니스 로직 처리, 즉 서비스를 만들기 위한 로직 처리

ex) 주문 처리, 예외 처리, 주문 취소 등

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

  • main : 소스 코드 및 리소스 파일
    • java : 작성한 소스 코드
    • resources
      • templates : 뷰파일
      • static : JS, CSS 등 정적 파일
      • application.yml : 스프링 부트 설정
  • test : 테스트 코드 및 리소스 파일
  • build.gradle 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2' // 인메모리 DB
compileOnly 'org.projectlombok:lombok' // 롬복
annotationProcessor 'org.projectlombok:lombok

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

TestController - 프레젠테이션 계층

@RestController
public class TestController {

    @Autowired  // 빈 주입
    TestService testService;

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

TestService - 비즈니스 계층

@Service
public class TestService {
    @Autowired
    MemberRepository memberRepository;  // 빈 주입

    public List<Member> getAllMembers() {
        return memberRepository.findAll(); // 멤버 목록 얻기
    }
}

Member , MemberRepository 비즈니스 계층

@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 테이블과 Member 클래스 매핑

member 라는 이름의 테이블에 접근해서 member 클래스에 매핑하는 구현체

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

data.sql 파일

  • 인메모리 DB → 애플리케이션 새로 실행시마다 원하는 데이터 자동으로 생성
  • resources 폴더에 작성
INSERT INTO member (id, name) VALUES (1, '이름1')
INSERT INTO member (id, name) VALUES (2, '이름2')
INSERT INTO member (id, name) VALUES (3, '이름3')
  • application.yml
spring:
  jpa:
		# 전송 쿼리 확인
    show-sql: true
    properties:
      hibernate:
        format_sql: true
		# 테이블 생성 후에 data.sql 실행
    defer-datasource-initialization: true
  • show-sql, format_sql : 애플리케이션 실행 과정에 DB에 쿼리를 할 때 실행 구문을 모두 보여줌
  • defer-datasource-initialization: true : 애플리케이션을 실행할 때 테이블을 생성하고 data.sql 파일에 있는 쿼리를 실행

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

  1. 톰캣에 /test GET 요청
  2. 스프링부트의 디스패처 서블릿이 URL 분석, 요청을 처리할 수 있는 컨트롤러를 찾음
    1. ex) TestController가 /test GET 요청을 처리할 수 있는 getAllMembers() 메서드를 가지고 있으므로 TestController에게 /test GET 요청 전달
  3. /test GET 요청을 처리할 수 있는 getAllMembers() 메서드와 요청 매치
  4. getAllMembers() 메서드는 비즈니스 계층과 퍼시스턴스 계층을 통하면서 필요한 데이터를 가져옴
  5. 뷰 리졸버 는 템플릿 엔진을 이용해 HTML 문서를 만들거나, JSON, XML 등의 데이터 생성
  6. members return 및 포스트맨에서 확인
profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글