하던거에 이어서
구글링을 하다 보니까, 스프링부트의 버전이 바뀌면서,
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
=> 이렇게 쓰던 코드가
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.datasource.hikari.jdbc-url=jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL
=> 이렇게 바뀐 것을 알 수 있었음
바꾼후에 테스트를 돌려보니

===>책에서 나와야한다는 출력이 나오고, 테스트가 성공적으로 잘도는것을 볼 수 있었음
03_4 등록 / 수정 / 조회 API 만들기
총 3개의 클래스가 필요함
- Request 데이터를 받을 Dto
- API 요청을 받을 Controller
- 트랜잭션, 도메인 기능 간의 순서를보장하는 Service

Web Layer
-> 흔히 사용하는 컨트롤러(@controller) 와 JSP 등의 뷰 템플릿 영억
-> 외부 요청과 응답에 대한 전반적인 영역을 담당
Service Layer
-> 일반적으로 Controller 와 Dao 중간 영역에서 사용
-> Transactional이 사용되어야 하는 영역
Repository Layer
-> DB와 같이 데이터 저장소에 접근하는 영역
-> Dao 영역
Dtos
-> Dto(data transfer object)는 계층간에 데이터 교환을 위한 객체를 의미함 => Dtos는 이것들의 영역을 이야기함
Domain Model
-> 도메인이라는 개발 다상을 모든 사람이 동일한 관점에서 이해하고, 공유할 수 있도록 단순화 시킨것
ex) 택시앱 - 배차, 탑승, 요금 등등이 모두 도메인
===> 이것들을 처리해야할 영역은 => Domain

*PostsService
import com.start.khw.springboot.domain.posts.PostsRepository;
import com.start.khw.springboot.web.dto.PostsSaveRequestsDto;
import lombok.RequiredArgsConstructor;
import org.hibernate.dialect.function.LpadRpadPadEmulation;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor
@Service
public class PostsService {
private final PostsRepository postsRepository;
@Transactional
public Long save(PostsSaveRequestsDto requestsDto) {
return postsRepository.save(requestsDto.toEntity())
.getId();
}
}
*PostsSaveRequestDto
package com.start.khw.springboot.web.dto;
import com.start.khw.springboot.domain.posts.Posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.metrics.buffering.StartupTimeline;
@Getter
@NoArgsConstructor
public class PostsSaveRequestsDto {
private String title;
private String content;
private String author;
@Builder
public PostsSaveRequestsDto(String title, String content, String author){
this.title = title;
this.content = content;
this.author = author;
}
public Posts toEntity() {
return Posts.builder()
.title(title)
.content(content)
.author(author)
.build();
}
}
*PostApiController
import com.start.khw.springboot.service.posts.PostsService;
import com.start.khw.springboot.web.dto.PostsSaveRequestsDto;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
public class PostApiController {
private final PostsService postsService;
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestsDto requestsDto){
return postsService.save(requestsDto);
}
}
*****
Entity클래스와 거의 유사한 형태임에도 Dto 클래스스를 추가로 생성한 이유가 있음
-> Entity클래스는 DB와 맞닿아있는 핵심 클래스이며, 이 클래스를 기준으로 테이블이 생성되고 스키마가 변경됨
-> 따라서 Entity클래스를 Request/Response 클래스로 사용해서는 안됨
-> 또한 화면 변경같은 사소한 기능 변경을 할때 마다 ,Entity 클래스를 변경할수는 없기 때문에, Entity클래스와 Controller에서 쓸 Dto는 분리해서 사용해야함
*****
코드를 적다가 느낀건데, 중간에 다른 클래스에서 메서드같은 것을 못 받아와서, 빨간색으로 표시가 되는 경우가 있는데
=> 이 상태로 테스트를 실행하거나 하면 오류가 뜸
===> 이런 경우에

다시 빌드 해주거나, 인텔리제이 자체를 껐다가 키면 해결이 됐음
'프로젝트 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스_실습' 카테고리의 다른 글
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 09 (0) | 2023.08.16 |
---|---|
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 08 (0) | 2023.08.15 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 06 (0) | 2023.08.13 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 05 (0) | 2023.08.12 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 04 (0) | 2023.08.11 |