[스프링부트3] 03장_스프링부트3 구조 이해하기
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하고 데이터를 포스트맨에서 확인 가능