Spring
HTTP, MVC 패턴
장진혁
2023. 3. 5. 13:08
과제를 진행하면서 HTTP가 뭐고, 어떤 역할을 하는지를 알게되었습니다.
공부한 내용을 바탕으로 요약을 하겠습니다.
HTTP란?
HTTP는 Hypertext Transfer Protocol의 약자로, 인터넷에서 데이터를 주고받기 위한 프로토콜입니다. 웹 브라우저와 웹 서버 사이에서 데이터를 전송하는 데 사용되며, 대부분의 웹 페이지에서 사용됩니다. HTTP는 인터넷에서 가장 중요한 프로토콜 중 하나입니다.
HTTP는 요청(Request)과 응답(Response)로 구성되어 있다.
요청은 클라이언트가 보내는 메시지이고
응답은 서버가 클라이언트한테 보내는 메시지 입니다.
HTTP메서드가 있는데 이것은 클라이언트가 서버한테 보내는 메시지 종류를 뜻한다.
많이 쓰는 메서드는 GET, POST, PUT, DELETE가 있다.
리소스 메서드 종류
- GET - 리소스 조회 (무엇을 달라)
- 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음
- POST - 요청 데이터 처리, 주로 등록에 사용 (등록, 저장 해줘)
- 메시지 바디를 통해 서버로 요청 데이터 전달
- 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용
- HTML 양식에 입력 된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공 예) HTML FORM에 입력한 정보로 회원 가입, 주문 등에서 사용
- 게시판, 뉴스 그룹, 메일링 리스트, 블로그 또는 유사한 기사 그룹에 메시지 게시 예) 게시판 글쓰기, 댓글 달기
- 서버가 아직 식별하지 않은 새 리소스 생성 예) 신규 주문 생성
- PUT - 리소스를 대체, 해당 리소스가 없으면 생성 (파일 저장, 덮어쓰기 와 비슷)
- 리소스가 있으면 대체
- 리소스가 없으면 생성
- 쉽게 이야기해서 덮어버림
- 중요! 클라이언트가 리소스를 식별
- 클라이언트가 리소스 위치를 알고 URI 지정
- POST와 차이점
- PATCH - 리소스 부분 변경
- DELETE - 리소스 삭제
HTTP 상태 코드
서버가 클라이언트에게 보내는 응답의 상태를 나타냅니다. 상태 코드는 3자리 숫자로 구성되며, 첫 번째 자리는 상태의 종류를 나타내고, 두 번째와 세 번째 자리는 상세한 상태를 나타냅니다. 대표적인 HTTP 상태 코드로는 200, 404, 500 등이 있습니다.
클라이어트가 보낸 요청의 처리 상태를 응답에서 알려줌
- 1xx (Informational): 요청이 수신되어 처리중
- 2xx (Successful): 요청 정상 처리
- 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요
- 4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
- 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함
3xx (Redirection) - 요청을 완료하기 위해 유저 에이전트의 추가 조치 필요
- 리다이렉션
- 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동
4xx (Client Error) - 클라이언트 오류
오류의 원인이 클라이언트에 있음
중요! 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패함
5xx (Server Error) - 서버 오류
서버 문제로 오류 발생
서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있음(복구가 되거나 등등)
MVC 패턴
평소에 MVC 패턴에 대해서는 Model, View, Controller 계층으로 나누어진 모델로 알고있었다.
하지만 이것을 어떻게 적용하고 이용하는지는 모르고 있었는 것 같다.
그래서 오늘 과제를 하면서 계층별로 나누어서 적용하여 코드를 작성해 보았다.
매니저님 순회 시간에 Model 이라는 개념에서 잘 이해가 가지 않아서 물어봤는데
내가 모르고 있었던 부분이 완벽하게 이해가 되었다.
그 부분이 무엇이냐면 모델이라는 부분이 Service, Repository, Entity 가 모여서 만들어진 것이 모델계층이라는 것이다.
Controller에서 계층간에 값을 이용할때 Dto를 쓰고 Model 계층에서는 Entity를 쓰다고 한다.
그리고 Controller에서 Entity를 쓰지말고 Model 계층에서는 Dto를 쓰지 말라고 한다.
이유는 간단하다 적용하는 계층이 다르기 때문이다.
MVC 패턴의 사용 이유
Business logic과 Presentation logic을 분리하기 위함
- Business logic : 데이터의 처리 및 응용을 수행하는 로직
- Presentation logic : 화면상의 디자인 구성을 위한 로직
Model
- 데이터 저장소와 연동하여 사용자의 데이터를 저장하거나
데이터를 출력하는 등의 일을 수행함 여러개의 데이터 변경작업(추가, 변경 , 삭제) - 여러개의 데이터 변경작업을 하나로 묶는 트랜잭션의 역할도 수행함 DAO class중 service에 해당됨
public class PostService {
private final PostRepository postRepository;
@Transactional
public Post createPost(PostDto postDto) {
Post post = new Post(postDto);
postRepository.save(post);
return post;
}
View
- 모델이 처리한 데이터나 결과를 바탕으로 사용자에게 출력할 화면을 만드는 역할
- 뷰 컴포넌트는 html , css , Js를 사용하여 출력할 UI를 생성해줌 생성된 UI는 웹 브라우저가 출력
Controller
- Client의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Model을 호출
- 클라이언트가 보낸 데이터가 있다면 Model을 호출할 때 전달하기 쉽게 데이터의 가공
- 모델의 업무 수행이 완료되면 그 결과를 바탕으로 화면을 구성하도록 View에 전달
@PostMapping("/api/posts") // 게시글 저장 name content password
public Post createPost(@RequestBody PostDto postDto) {
System.out.println(postDto.toString());
return postService.createPost(postDto);
DTO(Data Transfer Object)
- 데이터를 전달하기 위한 객체. 주로 View와 Controller 사이에서 데이터를 주고받을 때 활용.
- getter, setter 메소드 포함. 이 외의 비즈니스 로직은 포함하지 않음.
@Getter
@ToString
public class PostDto {
private String username;
private String password;
private String title;
private String contents;
}
Entity
- 실제 DB 테이블과 매핑되는 핵심 클래스. 절대로 Entity를 요청이나 응답 값을 전달하는 클래스로 사용해서는 안된다. 이를 기준으로 테이블이 생성되고 스키마가 변경되기 때문.
- DTO처럼 setter 메소드를 가지는 경우 가변 객체로 활용 가능. 비즈니스 로직 포함.
@Getter
@Entity
@NoArgsConstructor
public class Post extends Timestamped{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String username;