Post Api 만들기
등록기능
//PostApiConroller
import com.example.book.springboot.service.posts.PostsService;
import com.example.book.springboot.web.dto.PostsResponseDto;
import com.example.book.springboot.web.dto.PostsSaveRequestDto;
import com.example.book.springboot.web.dto.PostsUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RestController
public class PostsApiController {
private final PostsService postsService;
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestDto requestDto){
return postsService.save(requestDto);
}
@PutMapping("/api/v1/posts/{id}")
public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto){
return postsService.update(id, requestDto);
}
@GetMapping("/api/v1/posts/{id}")
public PostsResponseDto findById (@PathVariable Long id){
return postsService.findById(id);
}
@DeleteMapping("/api/v1/posts/{id}")
public Long delete(@PathVariable Long id){
postsService.delete(id);
return id;
}
}
URL 인자를 어떻게 받을지 정해서, postsservice에서 어떤 method를 호출할지 정리
//PostService
import java.util.List;
import java.util.stream.Collectors;
@RequiredArgsConstructor
@Service
public class PostsService {
private final PostsRepository postsRepository;
@Transactional
public Long save(PostsSaveRequestDto requestDto){
return postsRepository.save(requestDto.toEntity()).getId();
}
@Transactional
public Long update(Long id, PostsUpdateRequestDto requestDto){
Posts posts = postsRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id="+id));
posts.update(requestDto.getTitle(), requestDto.getContent());
return id;
}
public PostsResponseDto findById (Long id){
Posts entity = postsRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id="+id));
return new PostsResponseDto(entity);
}
@Transactional(readOnly = true)
public List<PostsListResponseDto> findAllDesc(){
return postsRepository.findAllDesc().stream()
.map(PostsListResponseDto::new) //.map(posts -> new PostsListResponseDto(posts))와 같음
.collect(Collectors.toList());
}
@Transactional
public void delete(Long id){
Posts posts = postsRepository.findById(id)
.orElseThrow(() -> new
IllegalArgumentException("해당 게시글이 없스니다. if="+id));
postsRepository.delete(posts);
}
}
PostsService에서는 DB에 연관된 PostsRepository를 통해 저장, 삭제, 수정을 함
그리고 PostsSaveRequestDto는 아래와 같이 작성한다
@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
private String title;
private String content;
private String author;
@Builder
public PostsSaveRequestDto(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();
}
}
이정도까지 하면 흐름이 보여야 한다.
Controller에서 URL을 통해 Service의 함수를 호출시키고
Service는 Dto를 통해서 Repository에 저장한다.
Dto는 Entity인 Posts와 다르게 변화가능하게 설정한다.
수정기능 + 삭제기능은 위 코드 참조
PostResponseDto를 추가해줘야됨
@Getter
public class PostsResponseDto {
private Long id;
private String title;
private String content;
private String author;
public PostsResponseDto(Posts entity){
this.id = entity.getId();
this.title = entity.getTitle();
this.content = entity.getContent();
this.author = entity.getAuthor();
}
}
그리고 PostsService에 update와 findById를 추가해주면 됨
Mustache로 기본페이지 만들기
@RequiredArgsConstructor
@Controller
public class IndexController {
private final PostsService postsService;
@GetMapping("/")
public String index(Model model){
model.addAttribute("posts", postsService.findAllDesc());
return "index";
}
@GetMapping("/posts/save")
public String postsSave(){
return "posts-save";
}
@GetMapping("/posts/update/{id}")
public String postsUpdate(@PathVariable Long id, Model model){
PostsResponseDto dto = postsService.findById(id);
model.addAttribute("post", dto);
return "posts-update";
}
}
Getmapping으로 String을 반환해주면, String.mustache파일을 불러오는거임
css는 header에
js는 footer에 두는게 좋음
흐름을 보면
Controller에서 URL을받고, mustache로 화면을 불러온다.
mustache에서 이벤트를 실행시키면, index.js에 저장된 api 주소를 불러와서 실행시킨다.
index.js에서 모든 처리를 다 해준다.
<!-- 목록 출력 영역 -->
<table class="table table-horizontal table-bordered">
<thead class="thead-strong">
<tr>
<th>게시글번호</th>
<th>제목</th>
<th>작성자</th>
<th>최종수정일</th>
</tr>
</thead>
<tbody id="tbody">
{{#posts}}
<tr>
<td>{{id}}</td>
<td><a href="/posts/update/{{id}}">{{title}}</a></td>
<td>{{author}}</td>
<td>{{modifiedDate}}</td>
</tr>
{{/posts}}
</tbody>
</table>
</div>
중간에 {{}}은 {{#posts}}에서 List를 순회화면서 받은 값들을 뿌려주는 것이다.
그리고 PostsRepository에서 받아오는 거니까
import java.util.List;
public interface PostsRepository extends JpaRepository<Posts,Long> {
@Query("SELECT p FROM Posts p ORDER BY p.id DESC")
List<Posts> findAllDesc();
}
@query문이 추가된다.
그리고 PostsService에서 Transaction을 추가해준다.
@Transactional(readOnly = true)
public List<PostsListResponseDto> findAllDesc(){
return postsRepository.findAllDesc().stream()
.map(PostsListResponseDto::new) //.map(posts -> new PostsListResponseDto(posts))와 같음
.collect(Collectors.toList());
}
그리고 출력할 양식이 필요하니 Dto를만들어준다. -> PostsListResponseDto
@Getter
public class PostsListResponseDto {
private Long id;
private String title;
private String author;
private LocalDateTime modifiedDate;
public PostsListResponseDto(Posts entity){
this.id = entity.getId();
this.title = entity.getTitle();
this.author = entity.getAuthor();
this.modifiedDate = entity.getModifiedDate();
}
}
'개발합시다. > BackEnd 공부' 카테고리의 다른 글
[SQL] 여러 값을 한개로 합칠때 (group_concat) (0) | 2022.09.26 |
---|---|
Django의 Session관리 (Redis 활용) (0) | 2021.12.15 |
Django의 request & Http (0) | 2021.12.08 |
Redis 추가공부 사항 (0) | 2021.12.08 |
Spring Boot 실습 기록 1 (0) | 2021.12.07 |