HTTP 요청을 받고 이 요청을 비즈니스 계층으로 전송하는 역할을 한다. 컨트롤러가 바로 프레젠테이션 계층의 역할을 한다.
모든 비즈니스 로직을 처리한다. 서비스가 이 역할을 한다.
모든 데이터베이스 관련 로직을 처리한다. 리포지토리(DAO)가 이 역할을 한다.
데이터를 저장하는 역할을 한다.
이 구조는 지금껏 많이 다뤄 보았기 때문에 바로 간단한 예제와 함께 구조를 살펴보려고 한다.
resource
폴더에 위와 같이 디렉토리와 파일을 생성한다.
- templates : HTML과 같은 뷰 관련 파일을 넣을 디렉토리
- static : JS, CSS, 이미지와 같은 정적인 파일을 넣을 디렉토리
application.yml
: 데이터베이스의 설정 정보, 로깅 설정 정보 등 스프링 부트 설정을 할 수 있는 파일data.sql
: 애플리케이션이 실행될 때 저장할 더미 데이터를 넣을 SQL 파일
dependencies {
(생략)
// 스프링 데이터 JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2' // 인메모리 데이터베이스
compileOnly 'org.projectlombok:lombok' // 롬복
annotationProcessor 'org.projectlombok:lombok'
}
package me.ansoohyeon.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
public class TestController {
@Autowired // TestService 빈 주입
TestService testService;
@GetMapping("/test")
public List<Member> getAllMembers(){
List<Member> members = testService.getAllMembers();
return members;
}
}
package me.ansoohyeon.springbootdeveloper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TestService {
@Autowired
MemberRepository memberRepository; // 빈 주입
public List<Member> getAllMembers(){
return memberRepository.findAll(); // 멤버 목록 얻기
}
}
package me.ansoohyeon.springbootdeveloper;
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;
}
package me.ansoohyeon.springbootdeveloper;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
}
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')
spring:
jpa:
# 전송 쿼리 확인
show-sql: true
properties:
hibernate:
format_sql: true
# 테이블 생성 후에 data.sql 실행
defer-datasource-initialization: true
프로젝트 실행 후 콘솔 창에서 'CREATE TABLE'을 검색해 테이블이 잘 만들어졌는지 확인해 보자.
테이블이 제대로 생성되었다. 이제 포스트맨으로 HTTP 요청을 시도해 보자.
data.sql
파일로 작성해 저장한 데이터를 클라이언트가 확인할 수 있다!
익숙한 MVC2 패턴을 적용하여 스프링 부트 3의 구조르 살펴보았다. 어노테이션이 조금 다른 것 말고는 크게 어려운 점이 없는 것 같다..!