CRUD
Create, Read, Update, Delete -> 웹 서비스의 가장 기초
initial 파일
패키지 안에 Post 패키지 만들기
Post 패키지 안의 PostDto 클래스 선언
package dev.dongyun.crud.post;
//Data Transfer Object
//데이터를 주고 받는데 이용
public class PostDto {
private String title;
private String content;
private String writer;
public PostDto() {
}
public PostDto(String title, String content, String writer) {
this.title = title;
this.content = content;
this.writer = writer;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public String getWriter() {
return writer;
}
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
public void setWriter(String writer) {
this.writer = writer;
}
@Override
public String toString() {
return "PostDto{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
", writer='" + writer + '\'' +
'}';
}
//Lombok
}
package dev.dongyun.crud.post;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
@Controller
@ResponseBody
//이렇게 붙여놓으면
//클래스 안 모든 함수들이 responsebody가
// 붙은 형태로 함수 선언 완료
@RequestMapping("post")
public class PostController {
private static final Logger logger = LoggerFactory.getLogger(PostController.class);
private final List<PostDto> postList;
public PostController() {
postList = new ArrayList<>();
//왜 위에는 list고 아래는 arraylist냐
// list는 인터페이스, arraylist는 구현체
}
@PostMapping("create")
public void createPost(@RequestBody PostDto postDto){
logger.info(postDto.toString());
this.postList.add(postDto);
}
}
{
"title":"Hello CRUD",
"content":"test posting",
"writer":"shucream"
}
로그확인
package dev.dongyun.crud.post;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Controller
@ResponseBody
//이렇게 붙여놓으면
//클래스 안 모든 함수들이 responsebody가
// 붙은 형태로 함수 선언 완료
@RequestMapping("post")
public class PostController {
private static final Logger logger = LoggerFactory.getLogger(PostController.class);
private final List<PostDto> postList;
public PostController() {
postList = new ArrayList<>();
//왜 위에는 list고 아래는 arraylist냐
// list는 인터페이스, arraylist는 구현체
}
@PostMapping("create")
public void createPost(@RequestBody PostDto postDto){
logger.info(postDto.toString());
this.postList.add(postDto);
}
@GetMapping("read-all")
public List<PostDto>readPostAll(){
logger.info("read all");
return this.postList;
}
@GetMapping("read-one")
public PostDto readPostOne(@RequestParam("id") int id){
logger.info("read one");
return this.postList.get(id);
}
@PatchMapping("update")
public void updatePost(
@RequestParam("id") int id,
@RequestBody PostDto postDto //포스트 요청의 body
){
PostDto targetPost = this.postList.get(id); //업데이트를 위한 목적 타겟
if (postDto.getTitle()!=null){
targetPost.setTitle(postDto.getTitle());
}
if (postDto.getContent()!=null){
targetPost.setContent(postDto.getContent());
}
this.postList.set(id, targetPost);
}
@DeleteMapping("delete")
public void deletePost(@RequestParam("id") int id){
this.postList.remove(id);
}
}
=> CRUD 기능 구현 완
List, ArrayList의 관계
private final List<PostDto> postList; public PostController() { postList = new ArrayList<>(); //왜 위에는 list고 아래는 arraylist냐 // list는 인터페이스, arraylist는 구현체
출처블로그
=> List list = new ArrayList();ArrayList list = new ArrayList<>();
대부분의 ArrayList는 아래보단 위와 같은 형태로 선언하여 사용된다.
ArrayList와 같은 구현체 클래스가 아닌, List라는 인터페이스로 선언하는 식이다.왜 ArrayList를 주로 저렇게 업캐스팅해서 선언하는지 그 이유를 알아보았다.
요약 : 객체지향 프로그래밍의 일환으로, 다형성을 지원하기 위해서이다.
처음부터 변경에 유연한 구조로 미리 설계하는 방식이라고 할 수 있다예를 들어.. ArrayList는 빠른 탐색에 유리하다는 장점이 있고,
마찬가지로 List인터페이스를 구현한 LinkedList는 삽입/삭제에 유리하다는 장점이 있다.만약 ArrayList list = new ArrayList<>(); 와 같이 ArrayList라는 인스턴스로 선언하면,
나중에 데이터의 용도가 바뀌어 삽입/삭제가 유리한 LinkedList 자료구조로 변경해야 할 때 ArrayList로 선언된 모든 부분을 LinkedList로 변경해 주어야 한다.
또, ArrayList에서는 지원하지만 LinkedList에서는 지원하지 않는 메소드를 사용했다면 그 메소드를 더 이상 사용할 수 없게 된다.
이는 변경에 유연하지 못한 구조라고 할 수 있다.
반면 List arrList = new ArrayList<>(); 와 같이 List라는 인스턴스로 선언하면,
똑같은 상황이 오더라도 선언부 외에 다른 부분을 변경할 필요가 없다. 이런 부분에서 이점이 있기 때문에 업캐스팅하여 선언하는 것이다.추가 ) 호눅스의 답변
두 가지 이유가 있다.
대부분의 경우 ArrayList만이 제공하는 기능을 쓰지 않는다.
List를 쓰고 싶은데, List를 구현한 클래스 중에 ArrayList로 그냥 선언하는 것.
List로 선언해야 List에서 제공하는 메소드까지 사용 가능하기 때문이다.
다른 리스트로 바꿔야 할 때 더 편하기 때문이다.추가 ) StackOverFlow
이는 인터페이스의 특정 구현과 내 코드를 분리하기 위해서이다.
List list = new ArrayList();와 같이 업캐스팅하면,
나머지 코드는 이 데이터가 List형이라는 것만 알고 있다.
즉, 이렇게 선언한 뒤 코드를 짜면 list의 자료형이 List이므로 모든 코드가 List인터페이스를 따르게 코드를 작성할 수 있고, 따라서 List인터페이스를 구현한 다른 자료형 간에 쉽게 전환할 수 있게 된다.결론 : 나중에 기존 코드를 바꾸지 않고 인터페이스 내에서 변경하기 쉽도록 하기 위해서이다.
추가 ) 이를 확장하면..
: 객체는 인터페이스를 사용해 선언하는 게 좋다는 결론에 도달할 수 있다.
매개변수 뿐 아니라 리턴값, 변수, 필드를 가능한 인터페이스 타입으로 선언할 수 있다.적합한 인터페이스가 없다면, 클래스 계층구조 중 가장 상위 클래스를 사용하면 된다.2)
POSTMAN 환경변수 설정 참조블로그