본문 바로가기

항해99/시험 리뷰

[항해99] Spring 주특기3 시험 리뷰

시험 문제

📌 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라서 문제가 생긴거였다.