[EC-Spring] 1주차-스프링 MVC
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에서 받아온 데이터를 전달받아 가공
예제
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)
: 해당 field
를 Table
의 'content'의 이름을 가지는 column
과 매핑, nullable
및 length
설정
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.java
의 Entity
에 매핑되고 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
의 인터페이스인 GreetingService
가 GreetingServiceImpl
로 구현된 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/
Author And Source
이 문제에 관하여([EC-Spring] 1주차-스프링 MVC), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@umtuk/EC-Spring-1주차-스프링-MVC저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)