Code.presso Java 웹 개발 트랙 체험단 활동 4주차 두번째 코스로 수강한 강의는 MyBatis와 H2 DB를 활용한 Spring Boot 웹 개발에 관한 내용이다.

강의 제목은 "Spring Boot 웹 개발 초급"으로, 자세한 정보는 👇🏻아래👇🏻 링크를 통해 확인할 수 있다.

📌 Spring Boot 웹 개발 초급 - 강의 정보

✋🏻 포스팅 내 사용된 사진 파일들의 저작권은 모두 코드프레소에 있으며, 강의자료 공유 및 업로드는 불가능합니다.


🏷 Data Access Layer

✔️ Data Access Layer

Data Access Layer 란 말그대로 Database에 접근하기 위한 계층이다.
Database에 접근하여 데이터 저장, 조회 등을 수행하는 역할을 하며 스프링에서는 @Mapper @Repository 어노테이션을 사용한다.

Service와 Database 사이에서 추상화 된 계층이기 때문에, Database 구체적인 기술이 변경되더라도 Data Access Layer 코드는 변경될 수 있지만, Service 계층의 코드는 영향을 받지 않도록 개발할 수 있게 된다!


✔️ 데이터를 접근하기 위한 기술

1. JDBC(Java Database Connectivity)

  • Database에 접근하기 위한 Java의 표준 API

2. JDBC Template

  • JDBC를 효율적으로 사용하기 위한 Spring API

3. SQL mapper

  • SQL과 Java 객체를 매핑하는 기술
  • Java에서 SQL Mapper 적용을 위해 MyBatis가 일반적으로 사용됨
  • 국내에서 많은 기업의 대규모 프로젝트에서 활용되고 있음

4. ORM(Object Relational Mapping)

  • RDBMS의 테이블과 Java 객체를 매핑하는 기술
  • Java, Spring에서 ORM 적용을 위해 Hibernate Data JPA가 주로 사용됨
  • 전 세계적으로는 SQL Mapper보다 사용률이 월등히 높으며 국내에서도 사용률이 높아져가고 있음

🏷 MyBatis 활용 준비

1. Maven 의존성 설정

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> : 현재 개발중인 애프리케이션의 버전

이제 MyBatisH2 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>

2. 스프링 설정과 H2 DB 활용

H2 Database 는 경량 RDBMS로 메모리에 데이터 저장이 가능하다.
Spring Boot에서는 별도의 설치 없이 Maven 의존성만으로 활용이 가능하기 때문에 개발 단계에서 테스트용으로 가볍게 활용이 가능하다!

📌 스프링 설정은 모두 외우려고 하기 보다는, 그때 그때 필요한 것들을 레퍼런스 문서를 통해 참고하자.

application.properties 파일에 위와 같이 H2 Database 의 접속 URL 및 계정 정보를 설정해보자.
차례대로,

  1. DB 연결을 위해 org.h2.Driver 를 사용한다는 뜻
  2. DB 접속 URL 명시
  3. DB에 접속하기 위한 사용자 이름
  4. DB에 접속하기 위한 패스워드

를 의미한다.

그 다음으로 h2 웹 console 정보를 설정하자.
h2 웹 콘솔을 사용할 것이며 웹 콘솔의 uri path를 /h2-console 로 설정하겠다는 의미이다.


이제 브라우저를 열어 http://localhost:8080/h2-console 을 입력해보자.

설정해주었던 URL, User Name, Password 를 알맞게 입력하고 연결하면,

실제 웹 콘솔에 로그인을 할 수 있다.
이전에 data.sql 파일을 통해 데이터를 초기화 해뒀기 때문에, 쿼리를 날렸을 때 위와 같이 데이터가 잘 조회되는 것을 확인할 수 있다.


3. MyBatis 설정

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를 위한 설정 파일의 위치를 명시
  1. mybatis-config.xml
  • MyBatis Framework가 읽음
  • SQL이 작성된 Mapper 파일의 위치 정보를 포함하여 다양한 설정이 가능함
  1. todo-mapper.xml
  • todo 테이블에 대한 SQL문이 작성된 파일

🏷 Mybatis를 활용한 Todo 저장 API 구현

📌 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의 동작을 살펴보자.

  • mapper에서 insert문을 사용하기 위해서는 <insert> 태그를 사용한다.
  • 인터페이스의 이름인 TodoMapper 와 xml파일의 namespace 안의 FCQN이 동일해야 한다.
  • 실제로 하나의 <mapper> 태그 안에는 여러개의 SQL이 들어갈 수 있는데 이를 구분해 주는 것이 바로 메소드 이름인 id 이다.
  • SQL문에서 저장하는 데이터의 실체는 인터페이스에서 @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);
}

➡️ 그리고 TodoServiceaddTodo() 메소드를 수정한다.

포스트맨을 통해 테스트를 해보자.

  • 포스트맨에서 API 호출을 한다.
  • TodoController 의 addTodo() 메소드가 실행이 된다.
  • 그 후 TodoService 의 addTodo() 메소드가 호출이 된다.
  • TodoMappersave() 메소드가 호출이 된다.
  • MyBatis에 의해 결과적으로 todo-mapper.xml 안에 해당 namespace를 가진 알맞은 SQL문이 실행된다.
  • 데이터베이스에 접근한다.

🏷 Mybatis를 활용한 Todo 리스트 조회 API 구현

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() 메소드를 호출하도록 TodoServicegetTodoList() 를 수정한다.


우리가 구현했던 TodoMapperfindAll() 메소드와 새롭게 추가한 <select> 태그 안의 SQL문이 위와 같이 매핑된다.


이렇게 MyBatis와 H2 DB를 활용해 간단하게 웹 개발을 진행해보았다!

코드프레소 홈페이지(https://www.codepresso.kr/)에는 오늘 포스팅한 Spring Boot 웹 개발 초급 관련 강의뿐만 아니라 다양한 강의들이 개설되어 있으니 모두 한번 씩 살펴보고 수강해보면 좋을 것 같다😃

profile
Backend Developer

0개의 댓글