아키텍처란 개발을 편리하고 가독성이 좋으며, 유지보수가 쉽도록 도와주도록 플랫폼에 맞춰 설계하는 것을 말한다.
MVC 아키텍처란 Model, View, Controller의 줄임말이다.
Controller = 사용자로부터 값을 받고 Model과 View와 통신하는 부분
view = model로 부터 처리된 값을 화면에 랜더링해주는 역할, 쉽게 말하면 데이터의 결과 값(JSP)
Model = 컨트롤러로부터 받은 값을 기반으로 데이터를 처리하는 부분
[Model]
DTO : 여러개의 데이터를 하나의 엔티티 객체로 만들어서 전달하는 것
- 계층 간 데이터를 처리하기 위한 객체
- 생성자가 없거나 반드시 파라미터가 없는 생성자 함수를 가지는 형태
- 속성(멤버 변수)는 private로 작성
- getter/setter를 사용해야한다
package com.guide.ex.dto.post;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PostDTO {
private ImageDTO imageDTO;
private Long postId;
@NotNull
private String title;
@NotNull
private String content;
private LocalDateTime registerDate;
private LocalDateTime modifyDate;
@NotNull
private BigDecimal locationX;
@NotNull
private BigDecimal locationY;
private boolean isDeleted;
private int views;
private int likeCount;
private int commentCount;
private String postType;
private Long memberId;
}
DAO : 데이터를 전문적으로 처리하는 객체
- 일반적으로 데이터베이스의 접근과 처리를 전담하는 객체를 의미한다.
- DAO는 주로 VO를 단위로 처리한다.
- DAO를 호출하는 객체는 DAO가 내부에서 어떤식으로 데이터를 처리하는지 알 수 없도록 구성한다.
package com.guide.ex.domain.post;
import com.guide.ex.domain.member.Member;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@NoArgsConstructor(access = AccessLevel.PROTECTED) // Lombok으로 protected 기본 생성자를 추가
@SuperBuilder
@EntityListeners(AuditingEntityListener.class)
@Getter
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long postId;
@Column(length = 100,nullable = false)
@Builder.Default
String title = ".";
@Column(nullable = false, columnDefinition = "TEXT")
@Builder.Default
String content = ".";
@CreatedDate
@Column(updatable = false)
private LocalDateTime registerDate;
@LastModifiedDate
@Column(updatable = false)
private LocalDateTime modifyDate;
@Column(precision = 10, scale = 2)
private BigDecimal locationX;
@Column(precision = 10, scale = 2)
private BigDecimal locationY;
@Column(nullable = false)
private final boolean isDeleted = false;
@Builder.Default
private int views = 0;
@Builder.Default
private int commentCount = 0;
private String postType;
@Builder.Default
private int likeCount = 0;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PostImage> postImages;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Like> likes;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
public Long getId() {
return this.postId;
}
public void setMember(Member member) {
this.member = member;
}
public void change(String title, String content) {
this.title = title;
this.content = content;
}
public void changeDate(LocalDateTime modifyDate) {
this.modifyDate = modifyDate;
}
public void setCommentCount(int commentCount) {
this.commentCount = commentCount;
}
}
VO : 데이터베이스의 하나의 데이터(한 행)을 처리하기 위해서 테이블과 유사한 구조의 클래스를 만들어서
객체로 처리하는 방식을 말한다.
- 데이터베이스의 값을 읽기만 가능하다.
- getter만 가능하다.
브라우저 → 컨트롤러 → 모델(DTO → VO → DAO → VO → DTO) → 뷰(화면에 랜더링)
https://velog.io/@leesomyoung/Java-DAO-DTO-VO의-개념
[브라우저가 값 요청시]
- 브라우저(사용자)가 어떠한 값을 요청
- 컨트롤러가 서비스에게 해당 값을 요청
- 이때 서비스(DAO)가 데이터베이스에 저장된 처리해야할 값에 접근해서 CRUD기능을 수행
- CRUD기능을 수행한 값을 VO에 담는다.
- VO에 담긴 값을 DTO로 하나의 객체로 만듬
- DTO로 만든 객체를 컨트롤러에게 전달
- 컨트롤러는 DTO를 뷰(jsp)에게 전달
- 뷰에서 화면에 보여주게 된다.
'스터디 > Spring' 카테고리의 다른 글
[Spring] 스프링 프레임워크란 (0) | 2024.05.19 |
---|