[EC-Spring] 1주차-스프링 MVC

27731 단어 JavaSpringJava

MVC 패턴

MVC(Model-View-Controller) 패턴이란 UI를 생성하기 위해 내부의 프로그램 로직을 3가지의 요소로 나누는 소프트웨어 디자인 패턴입니다

디자인 패턴은 소프트웨어를 제작함에 있어 보다 일반적이고, 재사용성이 좋은 솔루션을 의미

각 요소들은 Model, View, Controller라 칭합니다.

Model

UI와 독립적으로 구성되어 데이터, 내부 로직 및 규칙을 담당

View

실제로 보이는 모든 UI 요소를 표현

Controller

입력을 받아들이고 Model과 View에게 무엇을 하라고 지시

스프링에서 MVC 패턴

Dispatcher Servlet

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러

Repository

DB에 접근하는 메서드의 집합체

Service

DB에서 받아온 데이터를 전달받아 가공

예제

https://github.com/umtuk/ec-spring/tree/master/testmvc

build.gradle

plugins {
    id 'org.springframework.boot' version '2.6.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'org.ec'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

Entity

Entity는 데이터베이스 테이블의 한 레이블을 표현하는 단순 객체

Greeting.java

package org.ec.testmvc.Greeting.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "Greeting")
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "content", nullable = false, length = 30)
    private String content;
}

@Entity : 해당 객체가 JPA Entity임을 알림
@Table(name = "Greeting") : 해당 객체가 데이터베이스의 'Greeting' 이름을 갖는 테이블과 매핑

@Id: JPA의 ID임을 알림
@GeneratedValue(strategy = GenerationType.IDENTITY) : ID의 생성 방식(GenerationType)을 해당 데이터베이스의 생성 방식으로 위임(IDENTITY)

@Column(name = "content", nullable = false, length = 30) : 해당 fieldTable의 'content'의 이름을 가지는 column과 매핑, nullablelength 설정

Lombok@AllArgsConstructor, @NoArgsConstructor, @Getter : 다음과 같은 코드를 자동 구성

@Entity
@Table(name = "Greeting")
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "content", nullable = false, length = 30)
    private String content;

    // @NoArgsConstructor
    public Greeting() {

    }

    // @AllArgsConstructor
    public Greeting(Long id, String content) {
        this.id = id;
        this.content = content;
    }

    // @Getter
    public Long getId() {
        return this.id;
    }

    // @Getter
    public String getContent() {
        return this.content;
    }
}

GreetingRepository.java

package org.ec.testmvc.Greeting.repository;

import org.ec.testmvc.Greeting.domain.Greeting;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface GreetingRepository extends CrudRepository<Greeting, Long> {

}

@Repository : 해당 인터페이스가 Repository임을 알림
CrudRepository<Greeting, Long> : 해당 인터페이스가 DB 내부의 Greeting.javaEntity에 매핑되고 ID 타입으로 Long을 갖는 테이블에 접근하고 일반적인 CRUD 연산에 관한 메서드가 내장된 Repository

	long count()
    void delete(T entity)
    void deleteAll()
	void deleteAll(Iterable<? extends T> entities)
    void deleteAllById(Iterable<? extends ID> ids)
    void deleteById(ID id)
    boolean existsById(ID id)
    Iterable<T> findAll()
    Iterable<T> findAllById(Iterable<ID> ids)
    Iterable<T> findById(ID id)
    S save(S entity)
    Iterable<S> saveAll(Iterable<S> entities)

GreetingService.java

package org.ec.testmvc.Greeting.service;

import org.ec.testmvc.Greeting.domain.Greeting;

public interface GreetingService {

    Greeting create(Greeting greeting);
    Iterable<Greeting> readAll();
}

GreetingServiceImpl.java

package org.ec.testmvc.Greeting.service.impl;

import lombok.RequiredArgsConstructor;
import org.ec.testmvc.Greeting.domain.Greeting;
import org.ec.testmvc.Greeting.repository.GreetingRepository;
import org.ec.testmvc.Greeting.service.GreetingService;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class GreetingServiceImpl implements GreetingService {

    private final GreetingRepository greetingRepository;

    @Override
    public Greeting create(Greeting greeting) {
        return greetingRepository.save(greeting);
    }

    @Override
    public Iterable<Greeting> readAll() {
        return greetingRepository.findAll();
    }
}

@Service : GreetingServiceImpl의 인터페이스인 GreetingServiceGreetingServiceImpl로 구현된 Service임을 알림
Lombok@RequiredArgsConstructor : final 타입으로 생성된 field를 채우는 생성자를 자동 구성

GreetingController.java

package org.ec.testmvc.Greeting.controller;

import lombok.RequiredArgsConstructor;
import org.ec.testmvc.Greeting.domain.Greeting;
import org.ec.testmvc.Greeting.service.GreetingService;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/greeting")
public class GreetingController {

    private final GreetingService greetingService;

    @GetMapping
    public Iterable<Greeting> readAll() {
        return greetingService.readAll();
    }

    @PostMapping
    public Greeting create(@RequestBody Greeting greeting) {
        return greetingService.create(greeting);
    }
}

@RestController : 해당 클래스가 반환값을 특정 데이터 포맷으로 변경해주는 RestController임을 알림
Lombok@RequiredArgsConstructor : final 타입으로 생성된 field를 채우는 생성자를 자동 구성
@RequestMapping("/greeting") : HTTP 요청 중 /greeting으로 오는 요청을 매핑
@GetMapping : HTTP 요청 중 GET 메서드로 오는 요청을 매핑
@PostMapping : HTTP 요청 중 POST 메서드로 오는 요청을 매핑
@RequestBody : HTTP 요청에서 BODY에 있는 데이터 포맷을 읽어 해당 매개변수에 매핑

참고
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
https://www.javatpoint.com/spring-mvc-tutorial#:~:text=A%20Spring%20MVC%20is%20a,Inversion%20of%20Control%2C%20Dependency%20Injection.
https://spring.io/guides/gs/accessing-data-jpa/

좋은 웹페이지 즐겨찾기