[JSCODE] 2회차 미션 게시판CRUD

HMS·2023년 5월 11일

2회차 Level2 미션

학습목표

  • URL, Http Method를 활용한 기본 라우팅 방법 학습
  • Request Body, Query Params, Path Params 사용해보기
  • ORM 사용
    • 엔티티(테이블) 생성
    • 기본적인 CRUD 활용
  • 요청부터 응답까지 전체 과정 경험
  • REST API 설계
  • HTTP Status Code (상태 코드)
  • Postman 사용법

요구사항

1. 게시글 작성 기능
- 게시글은 제목, 내용을 포함한다.
- 게시글이 저장될 때, id(PK, primary key)도 같이 Auto-increment 형식으로 저장돼야 한다.
- 게시글 작성에 성공했을 때, 응답값으로 작성된 게시글에 대한 정보를 보여주어야 한다.
2. 게시글 전체 조회 기능
- 게시글을 조회할 때 id, 제목, 내용의 값이 포함돼야 한다.
3. 특정 게시글 조회 기능
- 게시글의 id(PK, primary key)로 특정 게시글을 조회한다.
- 게시글을 조회할 때 id, 제목, 내용의 값이 포함돼야 한다.
4. 특정 게시글 수정 기능
- 게시글의 id(PK, primary key)로 특정 게시글을 수정할 수 있어야 한다.
- 게시글의 제목, 내용을 수정할 수 있다.
- 게시글 수정에 성공했을 때, 응답값으로 수정된 게시글에 대한 정보를 보여주어야 한다.
5. 특정 게시글 삭제 기능
- 게시글의 id(PK, primary key)로 특정 게시글을 삭제할 수 있어야 한다.

알게된 부분

  1. @RestController와 @Controller 차이
    @Controller 어노테이션은 전통적인 스프링 MVC 컨트롤러 주로 View를 반환하는 컨트롤러로 사용
    @RestController 어노테이션은 스프링 4부터 도입된 어노테이션으로, RESTful 웹 서비스를 제공하는 컨트롤러로 컨트롤러 메서드에서 객체를 반환하면 해당 객체는 JSON 또는 XML 형식으로 직렬화되어 클라이언트에게 전달된다. @Controller와 @ResponseBody를 결합한 것으로 볼 수 있다.
  2. ResponseEntity 사용법
    기존에는 ModelAndView로 jsp의 view단에 데이터를 바로 보내줬었다. 이런 경우 무조건 상태코드200으로 전송되게되며 restful api로써 기능을 하지 못했는데, ResponseEntity를 사용하여 응답코드와 json형태의 데이터를 같이 응답하는 방법을 알게되었다.
// 기존방식은 대이터를 json형태로 직렬화하여 응답에 실어 보냈다.
	@ResponseBody
	@RequestMapping(value = "/camp/campListShow.kh", produces = "application/json;charset=utf-8", method = RequestMethod.GET)
	public String campListShow(@ModelAttribute SearchList sList, HttpServletRequest request, HttpSession session) {

		Member member = (Member) session.getAttribute("loginUser");
		if (member != null)
			sList.setMemberId(member.getMemberId());
		CampListResponse response = new CampListResponse(
				cService.printCampList(sList),
				cService.printListCount(sList)
				);
		return new Gson().toJson(response);
	}
// ResponseEntity를 사용한 방식은 ResponseBody를 적어주지 않아도 되고 코드가 훨씬 깔끔해졌다
	@GetMapping("/{id}")
    public ResponseEntity<PostResponseDTO> postDetails(@PathVariable Long id){
        PostResponseDTO postResponseDTO = postService.findPostById(id);
        return new ResponseEntity<>(postResponseDTO, HttpStatus.OK);
    }
```

```
  1. Mybatis에서 insert 후에 auto-increment 된 키값 받기
    useGeneratedKeys="true" keyColumn="id" keyProperty="id" 속성을 사용하면 insert 후에 auto-increment 된 키값을 받아올 수 있다.
    처음에는 반환값으로 주는줄 알고 int id = postMapper.insertPost(post); 형식으로 받아오려고 하다가 고생을 좀 했는데 알고보니 반환값으로는 0,1 성공여부만 오고 post인스턴스의 id값에 값이 할당되는 방식이었다. post.getId()를 하면 insert할때 부여된 id값으로 바뀌어 있다.
  2. entity와 dto는 다른 것 구분해야하는구나 -> 요청과 응답 dto 분리
    • entity는 데이터를 딱 받아서오는 객체
    • 엔티티에서 받은 데이터를 dto를 통해서 왔다갔다하도록 만든다
    • entity와 dto 분리 이유?
  3. mysql rollback 사용하기
    https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=minki0127&logNo=220783883574

어려웠던 점

  1. 게시판 하나 만드는것도 굉장히 어렵다고 느꼈다 ㅜㅜ .. 이 전 프로젝트에서와 다른방법으로 접근하다보니 쉽지 않았다. jpa를 공부하지 않아서 mybatis를 그대로 사용했는데 jpa로 변환을 할 계획이다.
  2. 메소드의 이름을 짓는게 어려웠다 어떤 공통점을 가지고 지어야하는지 감이 잘 오지 않아 인터넷에 돌아다니는 코드컨벤션을 참고하여 작성했다.
  3. 어떤 로직부터 구현하는것이 효과적인지 잘 모르겠다. 이번에는 Mapper -> service -> controller순으로 구현했는데 어떤 방식이 효율적인지 잘 모르겠다.
  4. Restful api에 대해 아직 잘 모르겠다. 좀더 알아봐야할 것 같다.
  5. 상태코드와 에러처리에 관해 공부해서 적용해야겠다.
  6. test코드 작성역시 공부하여 적용해야 겠다고 느꼈다.
profile
안녕하세요

0개의 댓글