[12.06] 내일배움캠프[Spring] TIL-26

박상훈·2022년 12월 6일
0

내일배움캠프[TIL]

목록 보기
26/72

[12.06] 내일배움캠프[Spring] TIL-26

1. Spring Mini Homework

  • View( html, css ,js )로 눈으로 보여지는 웹 페이지는 작성할 필요없다.
  • PostMan을 사용하여 요청에 대한 응답 값을 확인하자.
  • git에 올려 놓자.

요청 사상 정리

1) 전체 게시글 목록 조회 API
2) 게시글 작성 API
3) 선택한 게시글 조회 API
4) 선택한 게시글 수정 API
5) 선택한 게시글 삭제 API -> ( 비밀번호 확인할 것 )

API 명세 및 프로젝트 진행상황

프로젝트 구조

  • Controller : BoardController
  • DTO : BoardRequestDTO
  • Entity : Board, TimeStamped( 생성 시간과 수정 시간 기록을 위한 것 )

프로젝트 사용 Denpendency

  • Dev Tool, Spring web, Jpa, Lombok,H2

코드( Git에도 명시 )

  • BoardRequestDTO
package com.sparta.spartaboard.dto;

import lombok.Getter;

@Getter
public class BoardRequestDTO {
    private String title;
    private String username;
    private String contents;
    private String pwd;


}
  • BoardController
package com.sparta.spartaboard.controller;


import com.sparta.spartaboard.dto.BoardRequestDTO;
import com.sparta.spartaboard.entity.Board;
import com.sparta.spartaboard.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@Controller
@RequiredArgsConstructor
@RestController

public class BoardController {

    private final BoardService boardService;

    @GetMapping("/board/list")
    public List<Board> getBoardList(){
        return boardService.getBoardAll();
    }

    @PostMapping("/board/list")
    public Board createBoard(@RequestBody BoardRequestDTO boardDto){
        return boardService.createBoard(boardDto);
    }

    @GetMapping("/board/list/{id}")
    public Optional<Board> findBoard(@PathVariable Long id){
        return boardService.findBoardById(id);
    }

    @PutMapping("/board/list/{id}")
    public Long updateBoard(@PathVariable Long id, @RequestBody BoardRequestDTO boardDto){
        return boardService.update(id,boardDto);
    }

    @DeleteMapping("/board/list/{id}")
    public Long deleteBoard(@PathVariable Long id,@RequestBody BoardRequestDTO boardDto){
        return boardService.delete(id,boardDto);
    }

}
  • Board
package com.sparta.spartaboard.entity;
import com.sparta.spartaboard.dto.BoardRequestDTO;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@NoArgsConstructor
public class Board extends Timestamped {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String pwd;

    @Column(nullable = false)
    private String contents;

    public Board(BoardRequestDTO boardDto) {
        this.title = boardDto.getTitle();
        this.username = boardDto.getUsername();
        this.pwd = boardDto.getPwd();
        this.contents = boardDto.getContents();
    }
    public void update(BoardRequestDTO boardDto){
        this.title = boardDto.getTitle();
        this.username = boardDto.getUsername();
        this.contents = boardDto.getContents();
    }
}
  • TimeStamped
package com.sparta.spartaboard.entity;

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Timestamped {

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime modifiedAt;
}
  • BoardRepository
package com.sparta.spartaboard.repository;
import com.sparta.spartaboard.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BoardRepository extends JpaRepository<Board,Long> {
    List<Board> findAllByOrderByModifiedAtDesc();
}
  • BoardService
package com.sparta.spartaboard.service;


import com.sparta.spartaboard.dto.BoardRequestDTO;
import com.sparta.spartaboard.entity.Board;
import com.sparta.spartaboard.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    @Transactional
    public List<Board> getBoardAll() {
        return boardRepository.findAllByOrderByModifiedAtDesc();
    }
    @Transactional
    public Board createBoard(BoardRequestDTO boardDto) {
        Board board = new Board(boardDto);
        boardRepository.save(board);
        return board;
    }
    @Transactional
    public Optional<Board> findBoardById(Long id) {
        return Optional.ofNullable(boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("특정 게시글이 없습니다!")
        ));
    }
    @Transactional
    public Long update(Long id,BoardRequestDTO boardDto) {
       Board board = boardRepository.findById(id).orElseThrow(
               () -> new IllegalArgumentException("수정하고자 하는 게시글이 없습니다!")
       );

       board.update(boardDto);
       return board.getId();
    }

    public Long delete(Long id,BoardRequestDTO boardDto) {

       Board board = boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("수정하고자 하는 게시글이 없습니다!")
        );
       if(!board.getPwd().equals(boardDto.getPwd())){
           throw new IllegalArgumentException("비밀번호가 틀립니다!");
       }
       boardRepository.deleteById(id);
        return id;
    }
}
  • Application
package com.sparta.spartaboard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class SpartaboardApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpartaboardApplication.class, args);
    }

}

2. 프로그래머스 코테 - Level 0

  • 정수로 이루어진 일차원 배열을 입력 받는다.
  • 숫자 정수를 입력받는다.
  • 배열의 길이는 입력 받은 정수의 배수이다.
  • 그 때, 입력받은 숫자로 일차원 배열을 분배하는 코드를 작성해라
package org.example;


import java.util.Arrays;

class Solution {
    public int[][] solution(int[] num_list,int n ) {

        int [][] answer = new int[num_list.length/n][n];
        int count = 0;
        for(int i =0;i< num_list.length/n;i++){
            for(int j =0;j<n;j++){
                answer[i][j] = num_list[count];
                count++;
                if(count>num_list.length)
                    break;
            }
        }

       return answer;

    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(Arrays.deepToString(sol.solution(new int[]{100,95,2,4,5,6,18,33,948},3)));

    }
}

3. 느낀점⭐

1) 코드를 진행하던 중 생각난 것이 Test코드를 짜보지 않았다... 습관 좀 들이자!
2) Entity필드는 DB컬럼에서 벗어나는 속성은 들어갈 수 없다 -> DTO사용!
3) 게시글 정보 수정시 수정이 되지 않는 오류가 있었는데, Controller의 함수 이름과 , Service의 함수 이름이 동일하게 update()인 것을 보고 수정하니 됐다..!
4) 생각보다 API명세가 너무 중요하다.

profile
기록하는 습관

0개의 댓글