- View( html, css ,js )로 눈으로 보여지는 웹 페이지는 작성할 필요없다.
- PostMan을 사용하여 요청에 대한 응답 값을 확인하자.
- git에 올려 놓자.
1) 전체 게시글 목록 조회 API
2) 게시글 작성 API
3) 선택한 게시글 조회 API
4) 선택한 게시글 수정 API
5) 선택한 게시글 삭제 API -> ( 비밀번호 확인할 것 )
- GIt
README.md
에 작성 : https://github.com/PriceHoon/spartaBoard
Controller
: BoardControllerDTO
: BoardRequestDTOEntity
: Board, TimeStamped( 생성 시간과 수정 시간 기록을 위한 것 )
Dev Tool
,Spring web
,Jpa
,Lombok
,H2
- 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);
}
}
- 정수로 이루어진 일차원 배열을 입력 받는다.
- 숫자 정수를 입력받는다.
- 배열의 길이는 입력 받은 정수의 배수이다.
- 그 때, 입력받은 숫자로 일차원 배열을 분배하는 코드를 작성해라
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)));
}
}
1) 코드를 진행하던 중 생각난 것이 Test코드를 짜보지 않았다... 습관 좀 들이자!
2) Entity필드는 DB컬럼에서 벗어나는 속성은 들어갈 수 없다 -> DTO사용!
3) 게시글 정보 수정시 수정이 되지 않는 오류가 있었는데,Controller
의 함수 이름과 ,Service
의 함수 이름이 동일하게update()
인 것을 보고 수정하니 됐다..!
4) 생각보다 API명세가 너무 중요하다.