REST(Raepresentational State Transfer)는 웹과 같은 분산 시스템에서 Client와 Server 사잉의 통신 방식 중 하나이다 REST는 HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST,GET,PUT,DELETE)를 통해서 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다. 다시말해 URI를 통해서 자원의 이름을 정해서 데이터를 생성할때는 HTTP의 POST 매서드 ,조회는 Get매서드 , 수정은 Put메서드 , 삭제는 Delete메서드로 요청해 처리하는 것을 의미한다. REST는 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든것을 의미한다.
자원(Resource) : 접근할 대상, URI, 행위(동작) 표현이 아닌 자원을 구분하기 위하 고유한 이름(ID)
행위(Verb) : 행위(동작)는 HTTP method로 구분 - 조회(GET), 생성(POST), 수정(PUT), 삭제(DELETE)
표현(Representation of Resource) : 실제 데이터 - {“name”: “홍길동”, “age”: 25}
REST API 디자인 가이드
URI 설계 규칙
H2 데이터베이스는 자바로 만들어진 파일 기반의 오프소스 RDBMS로 스프링 부트가 지원하는 인메모리 RDBMS이다. H2는 용량이 매우 작고 별도 설치 없이 사용할 수 있으며 웹 관리 콘솔을 제공하기 때문에 개발용 로컬 DB로 사용하기 편리하다. 인메모리로 실행되기 때문에 애플리케이션을 다시 시작하면 데이터는 초기화 된다. H2 데이터베이스는 주로 개발용이나 소규모 프로젝트에서 사용되는 파일 기반의 겨량 데이터베이스이다. 먼저 build.gradle에 아래와 같이 H2 데이터 베이스에 대한 의존 설정을 하고 작용하면 H2 데이터베이스가 프로젝트에 설치된다.


MyBatis 는 RDBMS 연동을 쉽게 처리할 수 있게 도와 주는 오픈 소스 SQl 매핑 프레임워크로 DB테이블과 자바 객체 간의 맵핑(연결)을 유연하게 구현할 수 있다. 스프링 부트 프로젝트에서 MyBatis와 H2 데이터베이스를 연도앟기 위해서 build.gradle에 아래와 같이 MyBatis 에 대한 의존 설정한다.




@SErvice
@Slf4j
public class MemoService}
@Autowired
private MemoMappper memoMapper;
public List<Memo> memoList(){
return memoMapper.memoList();
}
public Memo getMemo(int no){
return memoMapper.findByNo(no);
}
}
@RestController
@RequiredArgsConstructor
public class MemController{
private final MemoService memoService;
@GetMapping("/memos");
public List<Memo> memoList(){
return memoService.memoList();
}
@GetMapping("/memos/{no}")
public Memo getMemo(@PathVariable("no")int no){
return memoService.getMemo(no);
}
}
메모를 추가,수정,삭제하는 기능을 구현하기
<insert id="addMemo" parameterType="Memo"
useGeneratedKeys="true" keyProperty="no">
INSERT INTO memo(title, content, writer, reg_date)
VALUES(#{title}, #{content}, #{writer}, NOW())
</insert>
<update id="updateMemo" parameterType="Memo">
UPDATE memo
SET title=#{title}, content=#{content}, writer=#{writer}, reg_date=NOW()
WHERE no=#{no}
</update>
<delete id="deleteMemo" >
DELETE FROM memo WHERE no=#{no}
</delete>
// 메모를 테이블에 저장하는 메서드
void addMemo(Memo memo);
// no에 해당하는 메모를 테이블에서 수정하는 메서드
void updateMemo(Memo memo);
// no에 해당하는 메모를 테이블에서 삭제하는 메서드
void deleteMemo(int no);
public void addMemo(Memo memo) {
memoMapper.addMemo(memo);
}
public void updateMemo(Memo memo) {
memoMapper.updateMemo(memo);
}
public void deleteMemo(int no) {
memoMapper.deleteMemo(no);
}
@PostMapping("/memos")
public Map<String, Object> addMemo(Memo memo) {
memoService.addMemo(memo);
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("result", true);
resultMap.put("memo", memo);
return resultMap;
}
@PutMapping("/memos")
public Map<String, Object> updateMemo(Memo memo) {
memoService.updateMemo(memo);
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("result", true);
return resultMap;
}
// 메모 삭제 요청 처리 메서드
@DeleteMapping("/memos")
public Map<String, Object> deleteMemo(@RequestParam("no") int no) {
memoService.deleteMemo(no);
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("result", true);
return resultMap;
}
JPA(Java Persistence API)는 자바 객체와 관계형 데이터베이스(RDB)를 연동하기 위해서 나온
ORM (Object-Relational Mapping)의 기술 표준이며 관계형 데이터베이스를 조작하기 위한 방법을정의한 인터페이스의 묶음 이다. ORM은 자바 객체(Object)와 관계형 데이터베이스(RDB)의 테이블을 자동으로 매핑(연결)시켜서 관계형 데이터베이스를 객체지향적으로 다룰 수 있도록 해주는 기술이다. 다시 말해 자바 객체와 데이터베이스 테이블을 연결해서 자바 언어로 관계형 데이터베이스를 조작할 수 있도록 지원하는 표준 기술이 ORM이다.
JPA는 ORM을 정의한 인터페이스의 묶음으로 실제 JPA를 사용하려면 이를 구현한 클래스 라이브러
리가 필요하다. JPA를 구현한 대표적인 클래스 라이브러리에는 Hibernate가 있으며 이 Hibernate는 내부적으로 JDBC API를 사용해 DB 작업을 수행하는 자바 ORM 프레임워크이다.
MyBatis와 Hibernate의 차이점은 MyBatis는 개발자가 SQL 쿼리를 직접 작성해서 Java 객체와
SQL을 맵핑해야 하지만 JPA를 기반으로 하는 Hibernate는 Java 객체가 데이터베이스 테이블에 직접 연결되어 처리하기 때문에 개발자가 별도로 SQL 쿼리를 작성하지 않아도 쿼리를 자동으로 생성해 준다. 이때 데이터베이스 테이블과 맵핑 되어 데이터를 관리하는 용도로 사용하는 자바 클래스를 엔티티(Entity)라고 부른다.
세계적으로 JPA를 기반으로 하는 Hibernate를 많이 사용하는 추세이지만 현재 우리나라는 MyBatis를 사용하는 곳이 상당히 많다. 비즈니스 요구사항이 복잡해지면 안정성과 속도 측면에서 쿼리를 직접 작성하면서 대응하는 것이 더 나을 수도 있지만 그 만큼 학습 시간과 쿼리를 작성하는 시간이 필요하기 때문에 Hibernate에 능숙해 진다면 업무 생산성을 많이 향상시킬 수도 있을 것이다. Hibernate는 통계나 동적 쿼리 같은 복잡한 쿼리를 처리하는 것이 어려운데 이 때는 QueryDSL이라는 라이브러리를 사용해서 이를 보완할 수 있다.
실무에서 자바 애플리케이션을 개발할 때 개발자가 신경 써야 할 것이 한 두가지가 아닌데 이 때 스프링 데이터(Spring Data) 프로젝트에서 지원하는 기능을 사용하면 개발자는 비즈니스 로직에 더 집중할 수 있다. 스프링 데이터에는 CRUD 기능을 지원하는 여러 가지 메서드가 정의되어 있으며 메서드는 자동으로 SQL 쿼리를 생성해 준다.
이외에도 페이징 처리 기능과 메서드 이름을 바탕으로 자동으로 SQL 쿼리를 만들어 주는 기능도 제
공한다. 또한 스프링 데이터를 상속해 각 데이터베이스의 특징에 맞춰서 기능을 확장한 스프링 데이터의 하위 기술(part 또는 module)도 제공하는데 이 확장 기술에는 ORM 표준 기술인 JPA를 지원하기 위한 스프링 데이터 JPA(Spring Data JPA )가 있고 NoSQL인 몽고DB를 지원하기 위한 스프링데이터 몽고디비(Spring Data MongoDB)가 포함되어 있다. 이외에도 Spring Data JDBC, Spring Data Redis, Spring Data REST, Spring Data Apache Cassandra, Spring Data Elasticsearch 등의 다양한 저장소 접근을 지원하기 위한 하위 모듈들이 존재한다.
스프링 데이터 JPA 모듈을 사용해 데이터베이스 작업을 구현할 때 일반적으로 JpaRepository 인터 페이스를 상속 받아서 만드는데, 이 인터페이스는 JPA를 편리하게 사용할 수 있는 유용한 메서드를 제공한다. JpaRepository 인터페이스는 스프링 데이터의 PagingAndSortingRepository를 상속 받은 인터페이스로 CRUD 작업에 필요한 메서드가 정의되어 있어서 개발자가 저장소(Repository) 역할을 하는 인터페이스를 만들고 JpaRepository 인터페이스를 상속받아 CRUD 기능과 정렬 그리고 페이징 기능 등을 간편하게 구현할 수 있다.











