Verity's Daily Logs_

[Spring Boot]JDBC+MyBatis 연결하기(2) 본문

Spring Framework

[Spring Boot]JDBC+MyBatis 연결하기(2)

johye0 2020. 10. 14. 10:51
반응형

지난번 작업했던 것을 토대로 DBMS에 연결해서 실제 데이터를 받아오는 것 까지 개발을 진행해 보도록 한다. 단순 쿼리 실행 및 리턴 확인 목적이니, 간단하게 사용자 정보 리스트를 받아오는 것으로 개발해 볼 것이다.

 

1. 도메인 클래스 작성 (UserVo.java)

사용자 정보를 받아올 수 있는 도메인 클래스를 com.example.demo.domain 패키지 아래 작성한다. 

어노테이션에 대한 설명은 나중에 Lombok에 대해 알아 볼 때 정리할 생각이지만, 아래 사용한 어노테이션들에 대한 설명은 간략하게 적고 넘어간다.

  • @Data: @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 유용한 어노테이션.
  • @NoArgsConstructor: 파라미터가 없는 기본 생성자를 생성해준다. 유사하게, @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어주는 어노테이션이다.
package com.example.demo.domain;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class UserVO {
	
	private String userId;
	private String userName;
	private String phoneNumber;
}

 

 

2. DAO 인터페이스 작성 (UserMapper.java)

데이터베이스 질의를 수행하는 DAO 클래스를 com.example.demo.mapper 패키지 아래 작성한다. 아래 내용은 데이터베이스의 현재 시간을 확인하는 메소드(selectNow())와, 사용자 정보를 받아오는 메서드(selectUserList())를 작성한 코드이다.

  • selectNow()와 같은 어노테이션 기반의 질의문 작성은 간단하고 직관적이지만, 실제로 프로덕션 레벨에서 요구되는 Dynamic SQL을 소화하기에는 한계가 있다.
  • selectUserList()와 같은 XML 방식의 Mapper는 기존 사용하던 쿼리를 거의 그대로 사용할 수 있기 때문에 활용도가 더 높은 편이다.
package com.example.demo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import com.example.demo.domain.UserVO;

@Mapper
public interface UserMapper {
	
	@Select("SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd') FROM DUAL")
	public String selectNow();
	
	public List<UserVO> selectUserList();
}

 

3. userMapper.xml 작성

사용자 정보를 받아올 수 있는 쿼리를 저장 할 xml 파일을 생성한다. (실행 쿼리는 DUAL 테이블로 대체) 

프로젝트의 통일성을 위해 DAO 클래스의 패키지명과 일치하는 경로에 저장하도록 하며, 파일명은 DAO 인터페이스와 1:1 매핑될 수 있도록 한다.

  • /src/main/java/com/example/demo/mapper/UserMapper.java
  • /src/main/resources/com/example/demo/mapper/UserMapper.xml

resultType은 리턴될 도메인 클래스 경로(UserVO)를 기재하며, 쿼리문의 식별자는 도메인 클래스의 변수명과 동일하게 작성해야 한다.

<?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.example.demo.mapper.UserMapper">
 
	<select id="selectUsers" resultType="com.example.demo.domain.UserVO">
		SELECT '111' userId, 'Hailey' userName, '02-0000-1111' phoneNumber
		  FROM DUAL
		UNION
		SELECT '222' userId, 'Dana' userName, '031-0000-2222' phoneNumber
		  FROM DUAL
		UNION
		SELECT '333' userId, 'Emma' userName, '02-0000-3333' phoneNumber FROM DUAL
	</select>
</mapper>

 

4. 비즈니스 클래스 작성 (UserService.java, UserServiceImpl.java)

DAO 클래스를 호출하는 비즈니스 로직을 수행할 수 있게끔 Service 클래스를 작성한다. 

com.example.demo.service.UserService.java

package com.example.demo.service;

import java.util.List;

import com.example.demo.domain.UserVO;

public interface UserService {

	public String getNow();
	
	public List<UserVO> getUserList();
}

 

com.example.demo.service.impl.UserServiceImpl.java

package com.example.demo.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demo.domain.UserVO;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;

@Service
public class UserServiceImpl implements UserService {
	
	@Autowired
	private UserMapper userDao;

	@Override
	public String getNow() {

		return userDao.selectNow();
	}

	@Override
	public List<UserVO> getUserList() {

		return userDao.selectUsers();
	}

}

 

5. 컨트롤러 클래스 작성 (UserController.java)

비즈니스 로직을 호출하는 컨트롤러 클래스를 작성한다. 페이지까지 리턴해주진 않을 것이기 때문에 @ResponseBody를 이용하여 데이터를 리턴 시킬 수 있도록 작성한다.

com.example.demo.controller.UserController.java

package com.example.demo.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.domain.UserVO;
import com.example.demo.service.impl.UserServiceImpl;

@Controller
public class UserController {
	
	@Autowired
	UserServiceImpl userServiceImpl;
	
	@RequestMapping(value = "/user/now", method = RequestMethod.GET)
    public @ResponseBody String getNow(Model model) {

		return userServiceImpl.getNow();
    }
	
	@GetMapping("user/list")
	public @ResponseBody List<UserVO> getUserList(){
		
		return userServiceImpl.getUserList();
	}
	

}

 

6. 서버 실행 & 결과 확인

서버 실행 후 컨트롤러에 작성한 경로로 접속하면 원하는 데이터가 받아와 지는 것을 확인할 수 있다.

http://localhost:8080/user/list

 

[참고]jsonobject.tistory.com/225

반응형
Comments