2월 5일 코드프레소 웹 개발 트랙 체험단에서 오프라인 교육을 진행했다.
교육했던 장소는 양천향교역 7번 출구 쪽 교육센터를 대관하였고 참가인원은 한 17명?정도 되보였다.
아무래도 코로나19 확산이 심해져서 거의 절반의 인원이 참여를 안한 듯하다. (이날 확진자 34000명..ㄷㄷㄷ)

그래도 오프라인에서 무엇을 학습하고 프로젝트는 어떻게 진행하는 지 궁금해서 참여했다.
진행한 내용은 이와 같다.
1. MyBatis db연동
2. Spring repository
3. 데이터 접근 기술
4. MyBatis와 데이터베이스 설정 – Maven과 Spring 설정
5. MyBatis와 데이터베이스를 활용한 TodoList 프로젝트 개발
Spring Repository
엔티티에 의해 생성된 데이터베이스에 접근하는 메소드들을 사용하기 위한 인터페이스이며 @Entity 에노테이션 데이터베이스 구조나 정의한 Service 계층에서 CRUD 메소드들을 정의하는 계층입니다.
데이터를 접근하기 위한 기술
JDBC
데이터베이스에 접근하기 위한 Java의 표준 API
JDBC Template
JDBC를 효율적으로 사용하기 위한 Spring API
SQL Mapper
- SQL과 Java 객체를 매핑하는 기술
- SQL의 input 또는 output을 java 객체와 매핑
- Java에서 SQL Mapper 적용을 위해 MyBatis가 일반적으로 사용된다.
ORM (JPA)
- RDBMS의 테이블과 Java 객체를 매핑하는 기술
- ORM 프레임워크가 객체와 테이블을 매핑하는 역할을 수행
- ORM 프레임워크가 SQL을 자동 생성
- Java, Spring에서 ORM 적용을 위해 Hibernate와 Spring Data JPA가 주로 사용된다.
Maven
- Java 프로젝트에서 사용되는 빌드 자동화 도구
- 소스코드를 실행 가능한 SW 산출물로 만드는 과정
Maven의 2가지의 주요 기능
- 프로젝트 구성 및 빌드 관리
- 라이브러리 의존성 관리
Maven의 라이브러리 의존성관리
- 사용할 외부 라이브러리 정보를 명시하면 자동 다운로드 후 사용
- 개발자가 필요한 라이브러리를 일일이 다운로드 받아 설정할 필요가 없음
- pom.xml 파일의 의존성 영역에 사용할 라이브러리 정보 설정
- 사용할 라이브러리가 Maven repository 에 등록되어 있어야 한다.
- Maven Central Repository: Maven에서 관리하는 중앙 repository
Maven의 pom.xml
pom – Project Object Model
Maven이 프로젝트를 빌드하기 위해서 필요한 정보를 기술하는 xml 파일이다.
- 프로젝트의 정보
- 프로젝트가 필요로 하는 라이브러리 의존성 정보
- 빌드 단계에서 사용되는 정보
dependencies 태그 하위에 다수의 dependency로 라이브러리 명시
dependencies 태그에 groupId, artifactId, version 등 명시
(초기에 start.spring.io에 dependencies에서 추가해서 이미 설정되어 있지만, 임의로 추가해서 넣어도 된다.)
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
pom.xml 즉, Maven 파일에서 <dependencies> 구간내에 위 코드를 작성하여 의존성을 추가한다.
그러면 MyBatis와 h2 데이터베이스 의존성을 추가한 것이다.
H2 Database
- RDBMS 중 하나로 메모리에 데이터를 저장 가능하다.
- 개발 단계에서 테스트용으로 가볍게 활용 가능
- 별도에 설치없이 스프링 의존성 추가만 하면 사용 가능
Spring 어플리케이션 설정

- application.properties 파일에 설정 정보 추가한다.
- 또는 application.yaml 포맷을 사용하기도 한다.
- resources 디렉토리 하위에 위치
- key = value 형태로 설정 정보를 작성
- 설정 정보는 라이브러리 별 공식 문서를 참고하여 작성
H2 Database 설정
- h2 database의 url 및 계정 정보 설정
- h2 웹 console 정보 설정
spring.datasource.url=jdbc:h2:mem:Todo
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
위 코드를 properties 파일 내에 입력한다.
SQL 테이블 생성
Spring 프로젝트의 resources 디렉토리 하위에 파일 생성 후 SQL 작성
DROP TABLE IF EXISTS Todo;
CREATE TABLE Todo
(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(255) NOT NULL,
isCompleted CHARACTER NOT NULL
);
테스트를 위해 3개의 엔티티만 생성할 것이다.
MyBatis 설정
spring.datasource.url=jdbc:h2:mem:Todo
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.driver-class-name=org.h2.Driver
mybatis.config-location=classpath:mybatis/mybatis-config.xml
아까 properties 파일에 설정을 추가했을 것이다.
이번엔 MyBatis의 설정 파일의 위치를 설정한다.
그리고 resources 디렉터리에 하위 디렉터리 mybatis를 생성
생성한 mybatis 디렉터리에 mybatis-config.xml를 생성하여 아래 코드를 작성한다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="mybatis/mapper/todo-mapper.xml"/>
</mappers>
</configuration>
이렇게 되면 mapper resource 경로 설정과 mybatis 구성 설정이 된 것이다.
마지막으로 생성한 mybatis 디렉터리 하위에 mapper 디렉터리 생성과 mapper 내에 todo-mapper.xml 파일을 생성하자.
Mapper 설정 파일
<?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.codepresso.TodoList.repository.TodoRepository">
<insert id="save">
INSERT INTO TODO(CONTENT, ISCOMPLETED)
VALUES (#{todo.content}, #{todo.isCompleted});
</insert>
<select id="findAll" resultType="com.codepresso.TodoList.vo.Todo">
SELECT *
FROM TODO;
</select>
<delete id="deleteById">
DELETE FROM TODO WHERE ID = ${id}
</delete>
</mapper>
이와 같이 todo-mapper.xml 내에 작성한다.
TodoRepository 즉, Repository 계층에서 SQL 쿼리문을 날릴 메소드를 정의하는 것이다.
- 테이블에 데이터를 생성하기 위한 INSERT 쿼리
- 데이터를 조회하기 위한 SELECT 쿼리
- 데이터를 삭제하기 위한 DELETE 쿼리
다음으로 com.codepresso.todo.repository 패키지 생성 후
com.codepresso.todo.repository.TodoRepository 인터페이스 생성 후 아래 코드 작성해보자
@Mapper
public interface TodoRepository {
void save(@Param("todo") Todo todo);
List<Todo> findAll();
void deleteById(@Param("id") Integer id);
}
인터페이스와 XML 연동 과정
mapper.xml과 Repository 인터페이스를 보면 서로 연동되는 지점이 있다.
mapper.xml 첫 줄에 Repository 파일 경로를 설정하고
다음 INSERT id를 save라는 이름으로 선언 후 INSERT 쿼리문을 작성한다.
이렇게 되면 위 사진과 같이 연동이 된다.
Service 계층에서 Repository으로의 의존성 주입
@Service
public class TodoService {
private TodoRepository todoRepository;
//todo 멤버 변수 repository에 의존성 주입을 하기 위한 코드를 완성하세요
public TodoService(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
Service 계층에서 Repository 생성자 주입을 시켜준다.
public void addTodo(@RequestBody Todo todo) {
todo.setIsCompleted("N");
todoService.addTodo(todo);
그리고 생성이 되는 지 테스트를 위해 위와 같은 코드를 Controller에서 작성한다.
Postman으로 API 테스트
애플리케이션을 재실행하고 Postman을 실행하여 위와 같이 Post와 URI를 설정하고 send 버튼을 누르면
성공적으로 입력된 것을 확인할 수 있다.
H2 Database에서 테스트
아까 properties에서 h2 Database를 설정했을 것이다.
설정 부분에 spring.h2.console.path=/h2-console 이 코드가 있는 데 이 코드는 h2 콘솔 경로를 설정하는 코드로 http://localhost:8080/h2-console 이 URI를 접속하면
이와 같이 화면이 출력될 것이다.
여기서 properties에 설정한 spring.datasource.url=jdbc:h2:mem:Todo 이 url를 작성하고 Connect 버튼을 누른다.
그러면 이와 같이 H2 콘솔이 접속된다. 위와 같이 SELECT 쿼리문을 작성하고 ctrl + Enter를 하면
Postman에서 입력한 값이 그대로 들어갔다는 것을 확인할 수 있다.
이처럼 GET (SELECT)조회와 DELETE 삭제도 똑같이 되는 지 직접 코드를 작성해보고 테스트하도록 한다.
※ 중간중간 이해가 안되거나 코드 내용이 부실한 점이 있다면 댓글로 알려주세요. 글 반영하고 코드 내용과 설명해드리겠습니다!
'Spring' 카테고리의 다른 글
[Spring boot] @ManyToMany를 사용하면 안 되는 이유 (2) | 2022.10.12 |
---|---|
JPA vs MyBatis 비교 (0) | 2022.03.25 |
[Spring] Spring Service, Bean, 의존성 주입 (0) | 2022.02.07 |
[Spring Boot] Spring 웹 개발 입문 (Spring Controller, HTTP, REST API 문서) (0) | 2022.02.03 |
[Spring Boot] Spring 웹 개발 입문 (Spring 프로젝트 생성) (0) | 2022.01.27 |