Spring Boot MVC

강성관·2025년 3월 13일

Framework

목록 보기
4/11

Thymeleaf Layout Dialect

  • 레이아웃을 따로 관리하여 유지보수성이 높아짐
  • layout:decorate를 사용하면 여러 페이지에서 공통 요소를 쉽게 재사용 가능
  • layout:fragment로 각 페이지의 콘텐츠만 정의하면 되므로 코드 중복 제거에 효과적
  • 코드 재사용성, 유지보수성 크게 개선
핵심 문법
구분 설명 예시
공통 조각 정의 특정 영역을 fragment로 지정 <th:block th:fragment="navLayout">
공통 조각 포함 다른 HTML에서 해당 fragment 삽입 <th:block th:replace="~{include/nav :: navLayout}"/>
내용 삽입 영역 각 페이지 고유 내용이 들어갈 자리 <th:block layout:fragment="content">

REST API

주요 구성 요소

  • 웹서비스의 복잡해져서 정리된 원칙과 설계 철학이 필요해짐
  • 자원(Resource) : URI(Uniform Resource Identifier)를 통해 식별되는 데이터
  • 행위(Method, Verb) : HTTP 메서드(POST, GET, PUT, DELETE 등)를 사용하여 자원에 대한 생성, 조회, 수정, 삭제 등의 작업을 수행
  • 표현(Representation) : JSON, XML 등 다양한 형식으로 자원의 상태를 주고받음

예시 코드

@Controller
public class BoardController {
    @GetMapping("/board")  // 전체 조회
    public String selectBoardList() { 
        return "/board/list";
    }

    @PostMapping("/board")  // 생성
    public String createBoard(int flag) { 
        return "/board/create";
    }

    @PatchMapping("/board/{id}")  // 수정
    public String updateBoard(@PathVariable("id") Long id) { 
        return "/board/update";
    }

    @DeleteMapping("/board/{id}")  // 삭제
    public String deleteBoard(@PathVariable("id") Long id) { 
        return "/board/delete";
    }
}

장단점

  1. 장점
    • 기능 파악이 쉽다.
  2. 단점
    • 강제되는 표현이 아니다.
    • HTTP Method 종류가 제한적(GET, POST, PUT, PATCH, DELETE)

비동기 통신 fetch

  1. 특징
    • AJAX의 경우 jQuery 라이브러리를 사용하지 않으면 코드가 굉장히 불편함.
    • 처리 속도가 빠른 Vanilla JS인 fetch가 자연스럽게 많이 사용됨.

예시 코드

fetch(url, options)
  .then(response => response.json())
  .then(data => {
    // 데이터를 성공적으로 받아왔을 때 처리하는 코드
    console.log(data);
  })
  .catch(error => {
    // 에러가 발생했을 때 처리하는 코드
    console.error('Error:', error);
  });
fetch('/board/'+articleId, {
    method: 'PUT',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
  })
  .then(response => response.json())
  .then(data => {
      alert('게시판 정보가 성공적으로 수정되었습니다.');
  })
  .catch(error => {
      alert('게시판 정보 수정 중 오류가 발생했습니다.');
  });
});

JSON 데이터 주고 받기

예시 코드

{
	"이름" : "홍길동",
    "나이" : 25,
    "국적" : "대한민국"
}
  • key : value 형태로 정렬되지 않은 속성들의 집합이다.

@RequestBody

  1. 전달된 데이터가 JSON형태일때 매개변수에 선언해서 사용 가능
@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // user 객체를 활용한 로직 처리
        return ResponseEntity.ok(user);
    }
}

@ResponseBody

  1. 요청 메소드의 상단부에 사용되는 어노테이션
  2. fetch에서 response.json() 함수를 사용하여 응답 데이터를 파싱하여 사용하기 위해서는 @ResponseBody 어노테이션을 반드시 사용해야함
    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@RequestBody UserDTO userDTO) {
        System.out.println("이름: " + userDTO.getName());
        System.out.println("이메일: " + userDTO.getEmail());

        return ResponseEntity.ok("사용자가 성공적으로 등록되었습니다.");
    }

클래스 매개변수 사용(1)

뷰 템플릿에서 컨트롤러로 정보를 전달할 때는 @RequestParam을 사용할 수도 있지만, 그 외에도 다양한 방법이 있음.
1. @RequestParam 어노테이션을 통해 하나의 데이터당 하나의 변수로 전달하는 방법
2. @RequestParam 어노테이션을 통해 Map 형태로 전달하는 방법
3. 클래스를 생성하여 객체 형태로 정보를 전달하는 방법

클래스 매개변수 사용(2)

DTO(Data Transfer Object) 사용
주의사항 : 클래스 필드의 명칭과 폼 데이터의 name값을 일치시켜야함


데이터베이스 연결

  1. ORM(Object Relational Mapping)
  • 자바와 데이터베이스 사이에 중간자 역할이 필요하다.(ex) JPA)
  • 대상이 객체 단위로 한다.
  • 중간자 필요! 이전에는 JDBC 또는 MyBatis를 썼지만, Spring을 배우면서 JPA를 사용 예정.
  1. JPA(Java Persistence API)
  • 객체와 DB 테이블을 매핑해주는 기술
  • 쿼리문 작성 필요 없음.
  • 복잡한 쿼리를 사용하기위해 보통 MyBatis와 JPA를 같이 씀.

JPA의 핵심 도구

  1. 엔티티(Entity)
  • 데이터베이스의 테이블과 매핑되는 클래스
  • DB의 컬럼을 필드로 표현(이름 일치할 필요는 없음.)
  • 테이블 형태를 클래스로 구현하기 위해 여러가지 어노테이션 사용
  1. 레퍼지토리(Repository)
  • 엔티티가 테이블에 데이터를 저장 및 관리할 수 있도록 하는 인터페이스
  • JPA가 제공하는 jpaRepository를 상속 받아서 사용 -> 상속시 기본 쿼리 메소드 자동 구성

JPA Entity

  1. @Entity
  • 역할 : 해당 클래스가 JPA 엔티티임을 선언
  • 필수 조건 :
    - 기본 생성자 필요
    - @Id 어노테이션 필수(기본 키 지정)
  1. @Id
  • 역할 : 해당 필드를 Primary Key로 지정
  • 필수 조건 : @Entity가 선언된 클래스에는 반드시 하나의 @Id가 있어야한다.
  1. @GeneratedValue
  • 역할 : Primary Key의 값을 자동 생성하도록 설정
  • 속성 옵션 : strategy = GenerationType.IDENTITY DB에서 자동 증가
  1. @Column
  • 역할 : 해당 필드를 DB의 컬럼에 매핑
  • 주요 속성 :
    - name : DB에 매핑될 컬럼명 지정
    • nullable : null 허용 여부 설정 (기본값 true)
    • length : 문자열 길이 지정
    • unique : 유니크 제약 조건 설정
  1. @CreationTimestamp
  • 역할 : 엔티티 생성 시 자동으로 현재 시간을 저장
  • 적용 대상 : LocalDateTime 등 시간 관련 필드
  1. @UpdateTimestamp
  • 역할 : 엔티티 수정 시 자동으로 현재 시간을 갱신
  • 적용 대상 : LocalDateTime 등 시간 관련 필드

요약
@Entity → 엔티티 클래스 선언
@Id → Primary Key 지정
@GeneratedValue → Primary Key 자동 생성 설정
@Column → 컬럼 매핑 및 속성 지정
@CreationTimestamp → 레코드 생성 시 자동 시간 기록
@UpdateTimestamp → 레코드 수정 시 자동 시간 갱신

주의사항

  • JPA에서 엔티티의 필드명에 _(언더바)를 붙이면 인식을 못하는 현상 발생
  • 엔티티의 필드명은 카멜케이스로 작성하고, @Column을 사용하여 컬럼명 명시적으로 표기

PK가 없는 경우

  • 모든 테이블에 PK 생성

복합키를 사용하는 경우

  • 반드시 @Embeddable 어노테이션 추가

JPA Repository

  1. Repository로 사용할 클래스(인터페이스)에 extends JpaRepository<엔티티 클래스, ID타입>{}
  2. 개발자가 작성한 리턴, 메소드명, 매개변수만으로 데이터베이스와 통신하도록 제약하기 위해서 인터페이스를 강제하고 있음
  3. 메소드 종류
    • findAll : List<엔티티> 형태로 반환
    • findAllById : 엔티티에 작성해둔 ID를 기준으로 조회
    • findBy엔티티의 필드명 : 게시판 제목 기준 = findByboardTitle
    • save(엔티티) : 엔티티의 ID값이 비어있으면 INSERT, 그렇지 않으면 UPDATE 쿼리 실행. 결과로 구성된 엔티티를 반환
    • deleteById(아이디) : 엔티티의 ID와 일치하는 행 삭제

profile
함께 공부해요!

0개의 댓글