Code.presso Java 웹 개발 트랙 체험단 활동 4주차 두번째 코스로 수강한 강의는 MyBatis와 H2 DB를 활용한 Spring Boot 웹 개발에 관한 내용이다.
강의 제목은 "Spring Boot 웹 개발 초급"으로, 자세한 정보는 👇🏻아래👇🏻 링크를 통해 확인할 수 있다.
✋🏻 포스팅 내 사용된 사진 파일들의 저작권은 모두 코드프레소에 있으며, 강의자료 공유 및 업로드는 불가능합니다.
Data Access Layer 란 말그대로 Database에 접근하기 위한 계층이다.
Database에 접근하여 데이터 저장, 조회 등을 수행하는 역할을 하며 스프링에서는 @Mapper
@Repository
어노테이션을 사용한다.
Service와 Database 사이에서 추상화 된 계층이기 때문에, Database 구체적인 기술이 변경되더라도 Data Access Layer 코드는 변경될 수 있지만, Service 계층의 코드는 영향을 받지 않도록 개발할 수 있게 된다!
1. JDBC(Java Database Connectivity)
2. JDBC Template
3. SQL mapper
4. ORM(Object Relational Mapping)
Maven
은 Java 프로젝트에서 사용되는 빌드(소스코드를 실행 가능한 SW 산출물로 만들어주는 과정) 자동화 도구이다.
Maven
은 2가지의 주요 기능을 가지는데 1.프로젝트 구성 및 빌드 관리 그리고 2. 라이브러리 의존성 관리이다.
사용할 외부 라이브러리 정보를 명시하면 자동으로 다운로드가 되기 때문에 개발자가 필요한 라이브러리를 일일이 다운받아 설정할 필요가 없다.
pom.xml
파일의 dependencies
영역에 사용할 라이브러리 정보를 설정한다.
pom
은 Project Object Model의 약자로, Maven이 프로젝트를 빌드하기 위해 필요한 정보를 기술하는 XML 파일이다.
📌 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.codepresso</groupId>
<artifactId>simple-blog</artifactId>
<version>0.0.1</version>
</project>
<project>
태그로 시작되며 간단하게는 위와 같은 형식을 가진다.<groupID>
: 다양한 프로젝트간 식별 가능한 고유한 이름(보통 회사 url의 역순)<artifactId>
: 프로젝트 하위의 애플리케이션 이름, 빌드 후 생성되는 산출물 파일명<version>
: 현재 개발중인 애프리케이션의 버전이제 MyBatis
와 H2 Database
사용을 위한 Maven
의존성을 다음과 같이 추가한다.
📌 pom.xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
H2 Database
는 경량 RDBMS로 메모리에 데이터 저장이 가능하다.
Spring Boot에서는 별도의 설치 없이 Maven
의존성만으로 활용이 가능하기 때문에 개발 단계에서 테스트용으로 가볍게 활용이 가능하다!
📌 스프링 설정은 모두 외우려고 하기 보다는, 그때 그때 필요한 것들을 레퍼런스 문서를 통해 참고하자.
application.properties
파일에 위와 같이 H2 Database
의 접속 URL 및 계정 정보를 설정해보자.
차례대로,
org.h2.Driver
를 사용한다는 뜻를 의미한다.
그 다음으로 h2 웹 console 정보를 설정하자.
h2 웹 콘솔을 사용할 것이며 웹 콘솔의 uri path를 /h2-console
로 설정하겠다는 의미이다.
이제 브라우저를 열어 http://localhost:8080/h2-console
을 입력해보자.
설정해주었던 URL, User Name, Password 를 알맞게 입력하고 연결하면,
실제 웹 콘솔에 로그인을 할 수 있다.
이전에 data.sql
파일을 통해 데이터를 초기화 해뒀기 때문에, 쿼리를 날렸을 때 위와 같이 데이터가 잘 조회되는 것을 확인할 수 있다.
mybatis.config-location=classpath:mybatis/mybatis-config.xml
MyBatis 설정을 위해 application.properties
에 위와 같은 코드로 MyBatis의 설정 파일의 위치를 추가한다.
이제 명시한 설정 파일을 생성해야 한다.
다음으로 resource
디렉토리 하위에 mybatis
디렉토리를 생성하고, resource/mybaits
디렉토리 하위에 mybatis-config.xml
파일을 생성한다.
<mappers></mappers>
태그 안에 xml 파일의 경로가 value 값으로 존재하는데, 이 경로 안에는 실제 데이터베이스에 접근하기 위한 SQL 문이 들어가있는 xml 파일이 존재한다.
이 예제에서는 하나의 태그만 존재하지만, 애플리케이션의 규모가 커지게 되면 여러개의 태그가 존재하게 된다.
앞서 작성했던 mybatis-config.xml
파일의 위치에 맞게 디렉토리와 파일을 생성해준다.
todo-mapper.xml
파일에 위와 같은 코드를 작성한다.
<insert>
태그 안에는 우리에게 익숙한 SQL문이 존재한다.
실제로 스프링 부트 애플리케이션에서 특정한 방법을 통해 이 SQL문을 실행시키고, 이 SQL문을 통해 연동되어있는 데이터베이스에 접근하게 된다.
📌 설정 파일 정리
1.application.properties
- Spring Framework가 읽고 해석하여 명시된 설정에 대한 작업을 수행함
- MyBatis를 위한 설정 파일의 위치를 명시
mybatis-config.xml
- MyBatis Framework가 읽음
- SQL이 작성된 Mapper 파일의 위치 정보를 포함하여 다양한 설정이 가능함
todo-mapper.xml
- todo 테이블에 대한 SQL문이 작성된 파일
📌 TodoMapper.java
인터페이스
@Mapper
public interface TodoMapper {
void save(@Param("todo") Todo todo);
}
com.codepresso.todo.mapper
패키지를 생성한 후 그 하위에 TodoMapper
인터페이스를 생성한 후 위와 같은 코드를 작성한다.
메소드의 이름은 save()
이고, 파라미터로는 Todo
타입을 가지고 @Param
어노테이션 안에는 "todo" 라는 문자열이 들어있다.
여기서 @Param
으로 전달한 파라미터를 잘 확인해야 한다.
todo-mapper.xml
의 SQL 문과 연관되어있기 때문이다.
✋🏻 잠깐! 흐름을 알고가자!
현재 우리가 구현하고 있는 Todo-List 어플리케이션을 전체적으로 살펴보자.
1.TodoService
에서 데이터베이스의 데이터를 저장하거나 조회하기 위해TodoMapper
를 사용하게 된다.
2.TodoMapper
인터페이스 안에 있는 알맞은 메소드가 호출이 된다.
3. MyBatis에 의해 호출된 인터페이스의 메소드에 바인딩되는 적절한 SQL문을todo-mapper.xml
안에서 찾는다.
4. 알맞은 SQL 문을 실행해 데이터베이스에 접근한다.
MyBatis Mapper의 동작을 살펴보자.
<insert>
태그를 사용한다. TodoMapper
와 xml파일의 namespace 안의 FCQN이 동일해야 한다.<mapper>
태그 안에는 여러개의 SQL이 들어갈 수 있는데 이를 구분해 주는 것이 바로 메소드 이름인 id
이다.@Param
어노테이션으로 넘겨준 Todo 타입의 todo가 된다.이제 완성된 TodoMapper
를 사용하기 위해서 Todo 저장 코드를 수정해야 한다!
📌 TodoService.java
@Serivice
public class TodoService {
private TodoMapper todoMapper;
public TodoService(TodoMapper todoMapper) {
this.todoMapper = todoMapper;
}
}
➡️ 먼저 TodoService
에서 TodoMapper
로의 의존성 주입을 설정하자.
public void addTodo(Todo todo) {
todo.setIsCompleted("N");
todoMapper.save(todo);
}
➡️ 그리고 TodoService
의 addTodo()
메소드를 수정한다.
포스트맨을 통해 테스트를 해보자.
TodoController
의 addTodo() 메소드가 실행이 된다.TodoService
의 addTodo() 메소드가 호출이 된다.TodoMapper
의 save()
메소드가 호출이 된다.todo-mapper.xml
안에 해당 namespace를 가진 알맞은 SQL문이 실행된다.Todo 리스트 저장과 비슷한 방법으로 이제 Todo 리스트 조회 API를 수정해보자.
📌 todo-mapper.xml
<select id="findAll" resultType="com.codepresso.todo.vo.Todo">
SELECT *
FROM TODO;
</select>
<mapper></mapper>
태그 내에 리스트 목록을 조회하는 SQL문을 작성한다.
데이터베이스로부터 조회하는 것이기 때문에 <select>
태그를 사용한다.
📌 TodoMapper.java
인터페이스
@Mapper
public interface TodoMapper {
void save(@Param("todo") Todo todo);
List<Todo> findAll();
}
TodoMapper
인터페이스에 findAll()
메소드를 추가한다.
📌 TodoService.java
public List<Todo> getTodoList() {
return todoMapper.findAll();
}
이 findAll()
메소드를 호출하도록 TodoService
의 getTodoList()
를 수정한다.
우리가 구현했던 TodoMapper
의 findAll()
메소드와 새롭게 추가한 <select>
태그 안의 SQL문이 위와 같이 매핑된다.
이렇게 MyBatis와 H2 DB를 활용해 간단하게 웹 개발을 진행해보았다!
코드프레소 홈페이지(https://www.codepresso.kr/)에는 오늘 포스팅한 Spring Boot 웹 개발 초급 관련 강의뿐만 아니라 다양한 강의들이 개설되어 있으니 모두 한번 씩 살펴보고 수강해보면 좋을 것 같다😃