<개발환경>
💻 Apple M1 Pro (macos14.5 on arm64)
🛠️ IDE: IntelliJ
🏁 Language: JAVA17
🔗 Framework: Springboot 3.3.0
⚙️ Project: Gradle
🗄️ Database: MySQL 8.3.0 Homebrew
사전준비
- MySQL 설치
MySQL이 설치되어 있지 않다면 아래글을 참고해주시길 바랍니다.
- DB 셋팅
스키마와 테이블, 필드를 미리 만들어두었습니다.
프로젝트 구조
원활한 이해를 위해 프로젝트 구조를 먼저 첨부합니다.
개인적으로는 전체적인 구조를 확인한 후 내용을 이해하는게 받아들이기 더 쉬운 것 같습니다.
- controller
UserController: 사용자 요청을 처리하는 컨트롤러 클래스입니다. 주로 HTTP 요청을 받아서 서비스 계층에 전달합니다. - dto
UserDto: 데이터 전송 객체(Data Transfer Object)입니다. 주로 컨트롤러와 서비스 계층 간에 데이터를 주고받을 때 사용됩니다. - mapper
UserMapper: MyBatis 매퍼 인터페이스입니다. 데이터베이스 쿼리를 실행하는 메서드가 정의되어 있습니다. - service
UserService: 비즈니스 로직을 처리하는 서비스 클래스입니다. 컨트롤러에서 받은 요청을 처리하고, 매퍼를 통해 데이터베이스와 상호작용합니다. - ProjectApiApplication
Spring Boot 메인 애플리케이션 클래스입니다. 애플리케이션을 시작하는 진입점입니다.
- application.yml
Spring Boot 설정 파일입니다. 서버 설정, 데이터 소스 설정, MyBatis 설정 등 애플리케이션 전반에 걸친 설정이 포함됩니다.
- config/database.yml
데이터베이스 설정 파일입니다. 데이터베이스 연결 정보(예: URL, 사용자 이름, 비밀번호 등)가 포함되어 있을 것입니다.
- mybatis/mappers/UserMapper.xml
MyBatis 매퍼 XML 파일입니다. SQL 쿼리와 매핑 정보가 정의되어 있습니다. - mybatis/mybatis-config.xml
MyBatis 설정 파일입니다. MyBatis의 전반적인 설정을 포함하고 있습니다.
MySQL + MyBatis 연결
- build.gradle 추가
dependencies {
// Spring Boot Web Starter
implementation 'org.springframework.boot:spring-boot-starter-web'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// Spring Boot DevTools
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// Spring Boot Configuration Processor
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
// Spring Boot Test Starter
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// MySQL Connector
runtimeOnly 'com.mysql:mysql-connector-j'
// MyBatis Spring Boot Starter (호환 가능한 최신 버전)
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
// Spring Boot JDBC Starter
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
}
*springboot 3.3.0에서 mybatis-spring-boot-starter:3.0.3 으로 설정하지 않으면 실행 시 에러가 발생할 수 있으니 주의하길 바랍니다.
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
ERROR 13480 --- [project-api] [ restartedMain] o.s.boot.SpringApplication : Application run failed
java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
- yaml 설정파일
저는 application.properties대신 application.yml을 사용해 주었습니다.
application.yml
spring:
application:
name: project-api
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: mybatis/mappers/*.xml
db 관련 정보는 이후에 추가될 설정 파일들을 관리하기 위해 database.yml 로 따로 만들어주었습니다.
config/database.yml
spring:
datasource:
url: ${MYSQL_PROJECT_URL}?serverTimezone=UTC&characterEncoding=UTF-8
username: ${MYSQL_USERNAME}
password: ${MYSQL_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
- 시스템 환경 환경변수 설정
저는 intellij를 통해 환경변수를 설정해주었습니다.
Run > Edit Configurations... > Modify options > Environment variables 검색
설정파일 추가에 따른 Main 수정
ProjectApiApplication.java
public static void main(String[] args) {
// SpringApplication.run(ProjectApiApplication.class, args);
SpringApplication app = new SpringApplicationBuilder(ProjectApiApplication.class).properties(
"spring.config.location="
+"classpath:/application.yml"
+", classpath:/config/database.yml")
.build();
app.run(args);
}
연결 확인을 위한 테스트 코드 작성
UserDto.java
@NoArgsConstructor
@Getter
@Setter
public class UserDto {
private String id;
private String username;
private String password;
private String email;
private String createdAt;
private String updatedAt;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(String updatedAt) {
this.updatedAt = updatedAt;
}
}
UserMapper.java
@Mapper
public interface UserMapper {
List<UserDto> findAll();
}
UserMapper.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.tistory.project_api.mapper.UserMapper">
<select id="findAll"
resultType="com.tistory.project_api.dto.UserDto">
SELECT id, username, password, email
, DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') AS createdAt
, DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i:%s') AS updatedAt
FROM USER
</select>
</mapper>
UserService.java
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public List<UserDto> findAll() {
return userMapper.findAll();
}
}
UserController.java
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public List<UserDto> getAllUsers() {
return userService.findAll();
}
}
실행확인
위의 과정을 진행한 후 실행하면 아래와 같이 http://localhost:8080/users URI를 통해 user 테이블에 있는 모든 사용자를 찾는 API가 호출되는 것을 확인할 수 있습니다.
*test1 데이터는 mysql workbench를 통해 직접 추가해주었습니다.
'Web' 카테고리의 다른 글
[springboot] 로그 설정1 (slf4j, logback) - 가장 쉽게 mybatis 쿼리 출력하기 (1) | 2024.06.03 |
---|---|
Springboot Security는 어떤 역할을 할까? (0) | 2024.06.01 |
[Springboot] 프로젝트 생성 후 에러발생: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.3.0 (0) | 2024.05.29 |
[Springboot] 프로젝트 생성하기 (0) | 2024.05.29 |
[spring-thymeleaf] th:field 사용시 th:value값 안나올 때 (0) | 2021.06.17 |