데이터베이스 설계 과정에서 사용되는 모델링 기법 중 하나로, 데이터베이스에 저장될 데이터 엔티티(entity)들과 엔티티 간의 관계(relationship)를 시각적으로 표현
어떤 시스템인지에 따라 Entity는 사람, 장소, 사건(이벤트), 오브젝트가 될 수 있음
데이터베이스의 테이블이 엔티티로 표현됨
특성, 엔티티의 성격, 관계, 또 다른 속성
데이터베이스의 테이블의 각 필드(컬럼)들이 엔티티 속성
엔티티 사이의 논리적인 연결 즉 엔티티와 엔티티가 존재의 형태나 행위로서 서로에게 영향을 주는 형태
속성의 값, 타입, 제약사항 등에 대한 범위를 표현
사용자의 기호에 따라 속성 타입만 그릴수도 있고 가독성을 위해서 생략할 수도 있음
데이터베이스 테이블의 Primary Key표현
중복이 없고 NULL 값이 없는 유일한 값에 지정하는 식별자
◆ 다이아몬드로 표현하기도 하고 아니면 열쇠로도 표현하기도 함
주 식별자는 유일한 속성이므로 다른 속성과의 명확한 구분을 위해 구분선을 두기도 함
해당 속성에 들어갈 값에 NULL을 비허용한다면 N 혹은 NN을 적음
만약 NULL을 허용한다면 N을 적지 않음
데이터베이스 테이블의 Foreign Key를 표현
외래 식별자 역시 Key의 일종이기 때문에 ERD 엔티티에도 열쇠 아이콘으로 표시
외래 식별자를 표시할 때에는 선을 이어주는데 개체와 관계를 따져 표시
엔티티끼리 관계가 있는 경우 선을 이어 관계를 맺어야 함
부모의 키를 자식에서 PK로 쓰는지 일반 속성으로 사용하는지에 따라 실선인지 점선인지 나뉘게 됨
실선으로 그으면 강한 관계를 나타내는 것이며 식별자 관계임
점선으로 그으면 약한 관계를 나타내는 것이며 비식별자 관계임
"Create, Read, Update, Delete"의 약어로 데이터 베이스와 같은 시스템에서 기본적인 데이터 관리 기능을 의미
기능 | HTTP | URL |
---|---|---|
게시글 목록 조회 | GET | /posts |
게시글 단건 조회 | GET | /posts/{id} |
게시글 작성 | POST | /posts |
게시글 수정 | PUT | /posts/{id} |
게시글 삭제 | DELETE | /posts{id} |
package com.goormthonUniv.goormthon.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String title;
@Column(nullable = false, columnDefinition = "TEXT")
private String content;
public Long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
}
package com.goormthonUniv.goormthon.controller;
import com.goormthonUniv.goormthon.dto.PostRequestDto;
import com.goormthonUniv.goormthon.dto.PostResponseDto;
import com.goormthonUniv.goormthon.repository.PostRepository;
import com.goormthonUniv.goormthon.service.PostService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/posts")
public class PostController {
private final PostService postService;
public PostController(PostService postService) {
this.postService = postService;
}
@PostMapping
public ResponseEntity<PostResponseDto> createPost(@RequestBody PostRequestDto request) {
PostResponseDto response = postService.createPost(request);
return new ResponseEntity<>(response, HttpStatus.CREATED);
}
@GetMapping
public List<PostResponseDto> list() {
return postService.getAllposts();
}
@GetMapping("/{id}")
public PostResponseDto get(@PathVariable Long id) {
return postService.getPost(id);
}
@DeleteMapping("/{id}")
public ResponseEntity<String> delete(@PathVariable Long id) {
postService.deletePost(id);
return ResponseEntity.ok("게시글이 성공적으로 삭제되었습니다.");
}
@PutMapping("/{id}")
public PostResponseDto update(@PathVariable Long id, @RequestBody @Valid PostRequestDto request) {
return postService.updatePost(id, request);
}
}
-PUT 후 GET 실행하여 제대로 수정이 되었는지 확인
어노테이션 | 위치 | 설명 |
---|---|---|
@RestController | Controller | 이 클래스가 REST API 요청을 처리하는 컨트롤러임을 나타냄 리턴값이 자동으로 JSON으로 변환 |
@RequestMapping("/posts") | Controller | 이 컨트롤러의 기본 경로를 설정 |
@PostMapping | Controller | HTTP POST 요청을 처리 |
@GetMapping | Controller | HTTP GET 요청을 처리 |
@DeleteMapping | Controller | HTTP DELETE 요청을 처리 |
@PutMapping | Controller | HTTP DELETE 요청을 처리 |
@PathVariable | Controller | URL 경로에 있는 값을 변수로 받기 /posts/3 → id = 3 |
@RequestBody | Controller | 요청 바디의 JSON → Java 객체로 변환 |
@Valid | Controller | @RequestBody로 받은 DTO의 유효성 검사를 수행 |
@Service | Service | 이 클래스가 비즈니스 로직을 수행하는 Service 컴포넌트임을 Spring에게 알려줌 |
@Entity | Entity | 이 클래스가 JPA가 관리하는 엔티티임을 나타냄 |
@Id | Entity | 이 필드가 테이블의 기본 키(PK) 임을 나타냄 |
@GeneratedValue(strategy = GenerationType.IDENTITY) | Entity | id 값을 DB가 자동 생성하도록 지정 |
@Column(nullable = false, length = 100) | Entity | 이 필드를 DB 컬럼으로 매핑 + 컬럼 제약 조건 설정 |
@Column(nullable = false, columnDefinition = "TEXT") | Entity | 이 필드를 DB에서 TEXT 타입 컬럼으로 저장 |