SWM 프로젝트로 spring을 이용해 BE 구성을 하지 싶다. 그래서 배워보고자 spring을 이용해 게시판 CRUD를 해 보자.
개인적으로, Node.js에 비해 Spring이 진입장벽이 더 높은 것 같긴 하다. 나는 C++을 메인으로 학교에서 배웠기 때문에 API 코드를 짜면 그 url로 접속하면 해당 함수 내에 있는 것들만 수행된다는 것이 상당히 직관적이었기 때문이다. 그런데 Spring은 MVC 2 형태라고 해서, controller, service, DAO, servlet, DB와 연동을 위해서는 mybatis, JPA, hibernate, mapper 등, 또 그걸 쓰려면 entity, DTO, repository까지... 알아야 할 것이 너무 많다. 처음에는 "springboot 시작하기"라는 책을 추천받아 구매했는데 좀 옛날 책이기도 하고, '일단 따라하셈.' 이런 느낌의, 불친절하다는 느낌을 받아 그냥 집어치우고 인터넷으로 찾아보기로 했다. 사실 인터넷이나 책이나 구현 순서는 똑같은데 내가 뭘 구현하는지는 알아야 동기부여도 생기고 이해를 할 거 아닌가.
http://book.interpark.com/product/BookDisplay.do?_method=detail&sc.shopNo=0000400000&sc.prdNo=303132908&sc.saNo=003002001&bid1=search&bid2=product&bid3=title&bid4=001
그리고, 지금 작성하는 내용은 맞을 수도 있지만, 틀릴 가능성도 존재한다. 내가 게시판을 만들면서 '이건 뭐하는거지? - 구글링 - 아 이런 거구나'를 느끼면서 작성한 것이기 때문에 이 글을 읽는 사람이 있다면 정확한 지식보다는 구현에 좀 더 집중해서 봤으면 좋겠다.
1. Spring에서 사용하는 다양한 개념들
https://dalpaeng00.tistory.com/83
MVC
MVC는 크게 2가지 모델이 있다. model 1은 모르겠고, model 2를 사용한다고 한다. 정보처리기사 공부하면서 봤던 그림이라 익숙했다. 크게 Model, View, Controller 3가지 개념이 있으며, 각각이 상호작용하면서 요청을 처리한다. 이렇게 구현하는 이유는 coupling이 낮아지기 때문이라고 한다. Model은 데이터를 저장하는 역할. View는 사용자에게 보이는 부분(FE라고 보면 되지 싶다). Controller는 요청에 따라 응답해주는 부분이라고 생각한다.
Spring은 조금 더 복잡한데, 위 링크를 따라가면 총 4가지가 보인다. Controller, Service, Dao, DB. 우리는 BE에 DB까지 연결할 거니까 DB가 있다고 생각하자. 이 Client, Controller, Service, DAO, DB 5개가 각각 왔다갔다하면서 요청을 처리하는 방식이다. 각각의 component가 상호작용할 때 DTO를 사용한다.
Client <-> Controller <-> Service <-> DAO <-> DB
크게 보면 위와 같이 구성이 된다고 한다.
- controller
controller는 client의 요청을 받아서 처리해준다. controller는 service를 호출해서 요청을 처리한다.
- service
service는 business logic을 수행한다.
- DAO
Data Access Object, DB를 이용해 데이터를 조회/조작하는 기능을 위해 만든 object.
- DB
MySQL과 같은 데이터베이스.
- DTO
Data Transfer Object, 데이터를 주고받을 때 사용하는 객체. toEntity method를 통해 DTO를 Entity로 만들어야 한다.
이렇게 5가지의 개념을 살펴봤다.
DB와 연결
각각의 구성요소가 뭔지 살펴봤다. 이제 그걸 어떤 tool로 구현 할 것이냐? 먼저 Spring과 DB를 연결하는 부분을 보자.
- 마이바티스Mybatis
java에서는 RDBMS를 이용하기 위해 JDBC(Java Database Connectivity)라는 것을 제공하는데, 이것을 조금 더 쉽게 사용하기 위한 것이 Mybatis이다. 즉, java에서 DB 프로그래밍을 도와주는 framework이다.
Mybatis를 이용하기 위해서는 Mapper라는 것이 필요하다.
- 매퍼Mapper
SQL과 Object를 매핑시켜 주는 것. 즉 SQL Mapper는 SQL을 작성해 주어야 한다. 아래는 떠돌아다니는 mapper의 예시를 하나 주워왔다.
// Mapper.java
package com.test.mapper;
public interface Mapper{
public String queryOne();
public String queryTwo(int input);
}
// Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org.dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mapper.Mapper">
<select id="queryOne" resultType="string">
SELECT * FROM test.temp
</select>
<select id="queryTwo" resultType="string" parameterType="int">
SELECT * FROM test.temp WHERE value=#{rno}
</select>
</mapper>
이런 식으로 어떤 query를 사용할 것인지를 Mapper.xml에 명시하고 여기에 작성한 query를 Mapper.java가 불러오고, Mapper.java에 있는 함수를 다른 함수에서 불러와 DB에 접근하는 방식인 것 같다.
- JPA
Java의 ORM 기술. ORM이라고 하면 Object와 DB를 별도의 query 없이 바로 연결해주는 것이다. JPA를 사용하면 query 없이 데이터에 접근할 수 있는 interace이다. CURD 쿼리를 바로 만들어 줘서 요새는 이걸 쓰는 추세라고 한다. 그러나 조금 어렵고, 복잡한 쿼리 작성이 어렵다고 한다. JPA에 대한 더 자세한 내용은 다음 글 참고
https://velog.io/@hyejinjeong9999/JPA%EC%99%80-JPA%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90
- Hibernate
JPA의 구현체이다.
- Spring Data JPA
JPA를 사용하기 쉽게 만들어 둔 모듈.
mybatis, JPA, hibernate 등, 또 그걸 쓰려면 entity, DTO, repository
- Entity
JPA에서 Entity는 table에 대응하는 하나의 class이다. 예를 들어 아래의 Entity는 바로 아래의 표와 같다고 받아들였다. Entity 설계를 위해서 @Id, @Column 등의 annotation을 이용한다고 한다.
@Entity
public class user {
String username;
String nickname;
}
user table
|
|
username
|
nickname
|
갑
|
tester1
|
을
|
tester2
|
- Annotation
주석이라는 뜻. 그런데 java에서는 위 코드의 @Entity처럼, 주석처럼 달아서 class에 특별한 의미를 부여하거나 기능을 넣어줄 수 있다.
- Repository
spring data JPA는 repository라는 interface를 제공한다. JPA를 추상화 한 것으로, interface에 맞는 규칙대로 입력하면 spring이 알아서 method와 query를 만들어서 Bean으로 등록한다.
- Bean
글을 찾아보면 Bean이라는 말이 나온다. Bean은 Spring이 관리하는 java 객체라고 한다.
JPA를 사용하지 않으면 mybatis에 대한 의존성, config 세팅을 해 주어야 하는데 JPA를 사용하면 이런 과정이 사라지고 솔직히 CURD 말고 더 많은 기능은 사용하지 않기 때문에 굳이 안 쓰는 것 같다. 그렇다면, 원래는
Browser
|
<->
|
Controller
servlet
|
<->
|
Service
|
<->
|
DAO
|
<->
|
DB
|
DTO
|
|
DTO
|
|
DTO
|
|
DTO
|
이런 과정이었어야 했다. 각 component의 상호작용은 DTO여야 했고, DAO는 DB data를 조회/조작하는 object이었다.
그러나 JPA를 이용하면
browser <-> controller(servlet) <-> service <-> repository <-> DB
Browser
|
<->
|
Controller
servlet
|
<->
|
Service
|
<->
|
Repository
|
<->
|
DB
|
DTO
|
|
DTO
|
|
DTO
|
|
Entity
|
이렇게 바뀌고 DAO에서 만들어야 했던 mapper과 같은 것들을 굳이 반복해 만들 필요가 없게 된다. 따라서, 해당 프로젝트는 이렇게 구현하고자 한다.