본문 바로가기

스터디/Spring

MVC 아키텍처

아키텍처란 개발을 편리하고 가독성이 좋으며, 유지보수가 쉽도록 도와주도록 플랫폼에 맞춰 설계하는 것을 말한다.

 

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의-개념

 

[브라우저가 값 요청시]

  1. 브라우저(사용자)가 어떠한 값을 요청
  2. 컨트롤러가 서비스에게 해당 값을 요청
  3. 이때 서비스(DAO)가 데이터베이스에 저장된 처리해야할 값에 접근해서 CRUD기능을 수행
  4. CRUD기능을 수행한 값을 VO에 담는다.
  5. VO에 담긴 값을 DTO로 하나의 객체로 만듬
  6. DTO로 만든 객체를 컨트롤러에게 전달
  7. 컨트롤러는 DTO를 (jsp)에게 전달
  8. 뷰에서 화면에 보여주게 된다.

'스터디 > Spring' 카테고리의 다른 글

[Spring] 스프링 프레임워크란  (0) 2024.05.19