본문 바로가기
프로젝트/스프링 부트와 AWS로 혼자 구현하는 웹 서비스_실습

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 07

by dudung__ 2023. 8. 14.

하던거에 이어서 

 

구글링을 하다 보니까, 스프링부트의 버전이 바뀌면서, 

 

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는 분리해서 사용해야함

*****

 

코드를 적다가 느낀건데, 중간에 다른 클래스에서 메서드같은 것을 못 받아와서, 빨간색으로 표시가 되는 경우가 있는데

=> 이 상태로 테스트를 실행하거나 하면 오류가 뜸

===> 이런 경우에 

 

다시 빌드 해주거나, 인텔리제이 자체를 껐다가 키면 해결이 됐음