시험 문제
📌 features : 구현해야 할 기능이에요.
게시글 목록 DB는 다음과 같이 설계되어있어요.
■ 테이블명 : Item
- id : 게시글 번호 (DB 인덱스)
- title (String) : 게시글 제목
- content (String) : 게시글 내용
- price(int) : 가격
- username : 작성자
■ 구현해야하는 API
- 판매 게시글을 작성하는 API
- 판매 게시글을 상세 조회하는 API
- 판매 게시글을 전체 조회하는 API
- 판매 게시글을 수정하는 API
- 판매 게시글을 삭제하는 API
⚠️ 주의사항
IntelliJ로 구동시켜보고, postman으로 테스트를 진행해 보세요.
게시글 작성을 3개 해보고, 전체조회를 해보세요!
모든 Entity는 그대로 반환하지 않고 생성자를 사용하여 DTO로 변환한 후 반환하세요!
Dto를 반환하지 않을 시 감점
제출한 답안
Q1. 배포 URL을 작성해주세요.
포트 접속이 계속 안되서 배포는 진행하지 못했음.
Q2. Controller 코드를 제출해주세요.
package com.sparta.test.controller;
import com.sparta.test.dto.SalesPostRequestDto;
import com.sparta.test.dto.SalesPostResponseDto;
import com.sparta.test.service.SalesPostService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/post")
public class SalesPostController {
private final SalesPostService salesPostService;
public SalesPostController(SalesPostService salesPostService) {
this.salesPostService = salesPostService;
}
// 판매 게시글 생성
@PostMapping
public ResponseEntity<SalesPostResponseDto> createPost(@RequestBody SalesPostRequestDto requestDto) {
SalesPostResponseDto responseDto = salesPostService.createPost(requestDto);
return new ResponseEntity<>(responseDto, HttpStatus.CREATED);
}
// Id로 조회
@GetMapping("/{id}")
public ResponseEntity<SalesPostResponseDto> getPostById(@PathVariable Long id) {
SalesPostResponseDto responseDto = salesPostService.getPostById(id);
return new ResponseEntity<>(responseDto, HttpStatus.OK);
}
// 전체 조회
@GetMapping
public ResponseEntity<List<SalesPostResponseDto>> getAllPosts() {
List<SalesPostResponseDto> responseDtos = salesPostService.getAllPosts();
return new ResponseEntity<>(responseDtos, HttpStatus.OK);
}
// 수정
@PutMapping("/{id}")
public ResponseEntity<SalesPostResponseDto> updatePost(@PathVariable Long id, @RequestBody SalesPostRequestDto requestDto) {
SalesPostResponseDto responseDto = salesPostService.updatePost(id, requestDto);
return new ResponseEntity<>(responseDto, HttpStatus.OK);
}
// 삭제
@DeleteMapping("/{id}")
public ResponseEntity<String> deletePost(@PathVariable Long id) {
salesPostService.deletePost(id);
return new ResponseEntity<>("삭제완료", HttpStatus.OK);
}
}
Q3. Service 코드를 제출해주세요.
package com.sparta.test.service;
import com.sparta.test.dto.SalesPostRequestDto;
import com.sparta.test.dto.SalesPostResponseDto;
import com.sparta.test.entity.SalesPost;
import com.sparta.test.repositpry.SalesPostRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
public class SalesPostService {
private final SalesPostRepository salesPostRepository;
@Autowired
public SalesPostService(SalesPostRepository salesPostRepository) {
this.salesPostRepository = salesPostRepository;
}
// 판매 게시글 생성
public SalesPostResponseDto createPost(SalesPostRequestDto requestDto) {
SalesPost entity = new SalesPost(requestDto.getTitle(), requestDto.getContent(), requestDto.getPrice(), requestDto.getUsername());
entity = salesPostRepository.save(entity);
return new SalesPostResponseDto(entity.getId(), entity.getTitle(), entity.getPrice(), entity.getUsername(), entity.getContent());
}
// Id 조회
public SalesPostResponseDto getPostById(Long id) {
Optional<SalesPost> optionalPost = salesPostRepository.findById(id);
if (optionalPost.isPresent()) {
SalesPost entity = optionalPost.get();
return new SalesPostResponseDto(entity.getId(), entity.getTitle(), entity.getPrice(), entity.getUsername(), entity.getContent());
} else {
throw new IllegalArgumentException("해당 ID의 게시글을 찾을 수 없습니다: " + id);
}
}
// 전체 조회
public List<SalesPostResponseDto> getAllPosts() {
List<SalesPost> entities = salesPostRepository.findAll();
List<SalesPostResponseDto> dtos = new ArrayList<>();
for (SalesPost entity : entities) {
dtos.add(new SalesPostResponseDto(entity.getId(), entity.getTitle(), entity.getPrice(), entity.getUsername(), entity.getContent()));
}
return dtos;
}
// 판매 게시글 수정
public SalesPostResponseDto updatePost(Long id, SalesPostRequestDto requestDto) {
Optional<SalesPost> optionalPost = salesPostRepository.findById(id);
if (optionalPost.isPresent()) {
SalesPost entity = optionalPost.get();
// ID를 설정하지 않고 엔터티를 생성합니다.
SalesPost updatedEntity = new SalesPost(requestDto.getTitle(), requestDto.getContent(), requestDto.getPrice(), requestDto.getUsername());
updatedEntity.setId(id); // ID 설정
// 업데이트된 엔터티를 저장합니다.
entity = salesPostRepository.save(updatedEntity);
return new SalesPostResponseDto(entity.getId(), entity.getTitle(), entity.getPrice(), entity.getUsername(), entity.getContent());
} else {
throw new IllegalArgumentException("해당 ID의 게시글을 찾을 수 없습니다: " + id);
}
}
// 판매 게시글 삭제
public void deletePost(Long id) {
if (salesPostRepository.existsById(id)) {
salesPostRepository.deleteById(id);
} else {
throw new IllegalArgumentException("해당 ID의 게시글을 찾을 수 없습니다: " + id);
}
}
}
Q4. Repository 코드를 제출해주세요.
package com.sparta.test.repositpry;
import com.sparta.test.entity.SalesPost;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SalesPostRepository extends JpaRepository<SalesPost, Long> {
}
Q5. Dto 코드 (모든 RequestDto를 작성해주세요.)
// RequestDto
package com.sparta.test.dto;
import lombok.Getter;
@Getter
public class SalesPostRequestDto {
private Long id;
private String title;
private String content;
private int price;
private String username;
}
// ResponseDto
package com.sparta.test.dto;
import lombok.Getter;
@Getter
public class SalesPostResponseDto {
private Long id;
private String title;
private int price;
private String username;
private String content;
public SalesPostResponseDto(Long id, String title, int price, String username, String content) {
this.id = id;
this.title = title;
this.price = price;
this.username = username;
this.content = content;
}
}
결과
사실 이번 시험문제 자체는 굉장히 쉽다고 느껴졌는데, 배포에 대한 시험을 보는 것 같았다.
코드는 한 시간? 정도 걸린 것 같은데 배포에서 계속 막혀서 2시까지 거의 꽉 채워서 응시를 하게 되었다..ㅠㅠ
결국 포트문제로 배포는 못했는데, 나중에 알고보니까 aws에서 admin으로 해놨는데, 나는 root라서 문제가 생긴거였다.
'항해99 > 시험 리뷰' 카테고리의 다른 글
[항해99] Spring 주특기2 시험 리뷰 (0) | 2024.03.13 |
---|---|
[항해99] Spring 주특기1 시험 리뷰 (0) | 2024.02.26 |
[항해99] 기초 프로그래밍2 시험 리뷰 (0) | 2024.02.19 |