Spring Study Group Week5 - GET, POST, PUT, DELETE, Entity, Repository, DAO, DTO, ORM, JPA
스프링 스터디 5주차 공부한 것입니다. 어라운드 허브 스튜디오의 스프링 강의 를 듣고 작성하였습니다.
Spring Boot 기초 - GET API
@RequestMapping
- value와 method로 정의하여 API를 개발하는 방식
- 이제는 고전적인 방법으로 사용하지 않음
1
2
3
4
5
// http://localhost:8080/api/v1/get-api/hello
@RequestMapping(value="/hello", method=RequestMethod.GET)
public String getHello() {
return "HelloWorld";
}
@GetMapping
- 별도의 파라미터 없이 GET API를 호출하는 경우 사용되는 방법
1
2
3
4
5
// http://localhost:8080/api/v1/get-api/name
@GetMapping(value="/name")
public String getName() {
return "Flature";
}
@PathVariable
- GET 형식의 요청에서 파라미터를 전달하기 위해 URL에 값을 담아 요청하는 방법
- 아래 방식은
@GetMapping
에서 사용된{변수}
의 이름과 메소드의 매개변수와 일치시켜야 함
1
2
3
4
@GetMapping(value="/variable1/{valiable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
- 아래 방식은
@GetMapping
에서 사용된{변수}
의 이름과 메소드의 매개변수가 다를 경우 사용하는 방식 - 변수의 관리의 용이를 위해 사용되는 방식
1
2
3
4
@GetMapping(value="/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
RequestParam
- Get 형식의 요청에서 쿼리 문자열을 전달하기 위해 사용되는 방법
?
를 기준으로 우측에{키} = {값}
의 형태로 전달되며, 복수 형태로 전달할 경우&
를 사용함
http://localhost:8080/api/v1/get-api/request1?name=flature&email=thinkground.flature@Gmail.com&organization=thinkground
1
2
3
4
5
6
7
@GetMapping(value="/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
- 아래 예시 코드는 어떤 요청 값이 들어올 지 모를 경우 사용하는 방식
1
2
3
4
5
6
7
8
9
10
@GetMapping(value="/request2")
public String getRequestParam2(@RequestParam Map<String, String> param) {
StringBuilder sb = new StringBuilder();
param.entrySet().forEach(map -> {
sb.append(map.getKey() + ": " + map.getValue() + "\n");
});
return sb.toString();
}
DTO 사용
- GET 형식의 요청에서 쿼리 문자열을 전달하기 위해 사용되는 방법
- key와 value가 정해져있지만, 받아야할 파라미터가 많을 경우 DTO 객체를 사용한 방식
1
2
3
4
5
6
7
8
@GetMapping(value="/request3")
public String getRequestParam3(MemberDTO memberDTO) {
//return memberDTO.getName + " "
+ memberDTO.getEmail + " "
+ memberDTO.Organization;
return memberDTO.toString;
}
1
2
3
4
5
6
7
public class MemberDTO {
private String name;
private String email;
private String organization;
...
}
Spring Boot 기초 - POST API
Post API
- 리소스를 추가하기 위해 사용되는 API
- @PostMapping: POST API를 제작하기 위해 사용되는 어노테이션(Annotation)
@ReauestMapping
+ POST method의 조합 - 일반적으로 추가하고자 하는 Resource를 http body에 추가하여 서버에 요청
- 그렇기 때문에
@RequestBody
를 이용하여 body에 담겨있는 값을 받아야 함
1
2
3
4
5
6
7
8
9
10
@PostMapping(value="/member")
public String postMember(@RequestBody Map<String, Object> postData) {
StringBuilder sb = new StringBuilder();
postData.entrySet()forEach(map -> {
sb.append(map.getKey() + ": " + map.getValue() + "\n");
});
return sb.toString();
}
- key와 value가 정해져있지만 받아야할 파라미터가 많을 경우 DTO 객체를 사용한 방식
1
2
3
4
@PostMapping(value="/member2")
public String postMemberDTO(@RequestBody MemberDTO memberDTO) {
return memberDTO.toString();
}
Spring Boot 기초 - PUT, DELETE API
Put API
- 해당 리소스가 존재하면 갱신하고, 리소스가 없을 경우에는 새로 생성해주는 API
- 업데이트를 위한 메소드
- 기본적인 동작 방식은 Post API와 동일
DELETE API
- 서버를 통해 리소스를 삭제하기 위해 사용되는 API
- 일반적으로
@PathVariable
을 통해 리소스 ID 등을 받아 처리
ResponseEntity
- Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스를 상속받아 사용하는 클래스
사용자의 HttpRequest에 대한 응답 데이터를 포함
- 포함하는 클래스
- HttpStatus
- HttpHeader
- HttpBody
Spring Boot 기초 - Entity, DAO, Repository, DTO
Spring Boot 서비스 구조
Entity
Entity(Domain)
- 데이터베이스에 쓰일 컬럼과 여러 엔티티 간의 연관관계를 정의
- 데이터베이스의 테이블을 하나의 엔티티로 생각해도 무방함
- 실제 데이터베이스의 테이블과 1:1로 매핑됨
- 이 클래스의 필드는 각 테이블 내부의 컬럼(Column)을 의미
DAO
Repository
- Entity에 의해 생성된 데이터베이스에 접근하는 메소드를 사용하기 위한 인터페이스
- Service와 DB를 연결하는 고리의 역할을 수행
- 데이터베이스에 적용하고자 하는 CRUD를 정의하는 영역
DAO (Data Access Object)
- 데이터베이스에 접근하는 객체를 의미 (Persistance Layer)
- Service가 DB에 연결할 수 있게 해주는 역할
- DB를 사용하여 데이터를 조회하거나 조작하는 기능을 전담
DTO
DTO(Data Transfer Object)
- DTO는 VO(Value Object)로 불리기도 하며, 계층간 데이터 교환을 위한 객체를 의미
- VO의 경우 Read Only의 개념을 가지고 있음
Spring Boot 기초 - ORM과 JPA
ORM(Object Relational Mapping)
ORM이란?
- 어플리케이션의 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미
- Java의 데이터 클래스와 관계형 데이터베이스의 테이블을 매핑
- 객체지향 프로그래밍과 관계형 데이터베이스의 차이로 발생하는 제약사항을 해결해주는 역할을 수행
- 대표적으로 JPA, Hibernate 등이 있음 (Persistent API)
ORM의 장점
- SQL 쿼리가 아닌 직관적인 코드로 데이터를 조작할 수 있음
- 개발자가 보다 비즈니스 로직에 집중할 수 있음
- 재사용 및 유지보수가 편리
- ORM은 독립적으로 작성되어 있어 재사용이 가능
- 매핑 정보를 명확하게 설계하기 때문에 따로 데이터베이스를 볼 필요가 없음
- DBMS에 대한 종속성이 줄어듬
- DBMS를 교체하는 작업을 비교적 적은 리스크로 수행 가능
ORM의 단점
- 복잡성이 커질 경우 ORM만으로 구현하기 어려움
- 직접 쿼리를 구현하지 않아 복잡한 설계가 어려움
- 잘못 구현할 경우 속도 저하 발생
- 대형 쿼리는 별도의 튜닝이 필요할 수 있음
JPA (Java Persistance API)
JPA란?
- JPA는 Java Persistance API의 줄임말이며, ORM과 관련된 인터페이스의 모음
- Java 진영에서 표준 ORM으로 채택되어 있음
- ORM이 큰 개념이라고 하면, JPA는 더 구체화시킨 스펙을 포함하고 있음
Hibernate
- ORM Framework 중 하나
- JPA의 실제 구현체 중 하나이며, 현재 JPA 구현체 중 가장 많이 사용됨
Spring Data JPA
- Spring Framework에서 JPA를 편리하게 사용할 수 있게 지원하는 라이브러리
- CRUD 처리용 인터페이스 제공
- Repository 개발 시 인터페이스만 작성하면 구현 객체를 동적으로 생성해서 주입
- 데이터 접근 계층 개발 시 인터페이스만 작성해도 됨
- Hibernate에서 자주 사용되는 기능을 조금 더 쉽게 사용할 수 있게 구현
This post is licensed under CC BY 4.0 by the author.