폴더/계층 구조는 이렇다

많은 블로그, 정보들을 확인 봤지만 쉽지 않다. MyBatis 설정을 간단하게 해 보자

 


 

https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure

  • build.gradle
    1. org.springframework.boot version 확인
    2. java - sourceCompatibility 확인
    3. dependencies [ https://mvnrepository.com ]
      1. mysql-connector-java
      2. mybatis-spring-boot-starter
plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.15'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

java {
	sourceCompatibility = '8'
}

dependencies {
	implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.28'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
}

MyBatis 설정이 쉽지 않았는데, 아마 버전 충돌을 의심해 볼 수 있었다

springboot 프로젝트 생성 시, 기본적으로 Springboot 버전은 3.1이었고, java 버전은 17로 선언되어 있었다

MyBatis 공식 사이트 Requirements 버전 호환성에 맞게 설정해 주었다

 

dependencies 수정 후, Gradle Refresh !! 부트 버전 변경 같은 경우에는 Spring 항목 이용함

  • application.yml
server:
  port: 8000
  
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Seoul
    username: MySQLId
    password: MySQLPassword

mybatis:
  type-aliases-package: com.example.demo
  mapper-locations: mybatis/mapper/**/*.xml

type-aliases-package을 통해 별칭을 설정할 수 있다

com.example.demo 까지 선언하였지만 아래 경로까지 다 인식해 주는 걸로 확인했다

<!-- before -->
<select id="getAllUsers" resultType="com.example.demo.user.model.User">
<!-- after -->
<select id="getAllUsers" resultType="User">

중요한 것은 class 이름만 선언해야 한다 (user.model.User ❌ model.User ❌   User ⭕️ )

 

mapper-locations 설정은 mapper.xml 위치를 알려준다.

mybatis/mapper/*.xml 일 경우는 mapper 폴더 내의 xml 파일을 인식하지만

**/*.xml 로 선언할 경우, mapper/ ... folder1 / ... folder2 / *.xml  하위 경로에 있는 모든 xml 파일들을 인식한다

 

 

  • 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.example.demo.mapper.UserMapper">
    <select id="getAllUsers" resultType="User">
        SELECT * FROM User
    </select>
</mapper>
  • UserMapper.java
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.user.model.User;

@Mapper
public interface UserMapper {
	
	List<User> getAllUsers() throws Exception;
	
	@Select("SELECT * FROM User")
	List<User> selectAnnotation() throws Exception;
	
}
  1. Java(Interface) , XML 파일의 이름이 동일할 필요는 없다. 하지만 XML namespace 경로를 잘 지정해주어야 한다
  2. Java(Interface)에 선언한 함수 이름과 XML에 선언한 id는 동일해야 한다
  3. XML 파일을 활용하지 않는다면, @Select, @Insert, @Update, @Delete, @Results 어노테이션을 활용할 수 있다

 

  • UserServiceImpl.java
package com.example.demo.user.service.impl;

import java.util.List;

import org.springframework.stereotype.Service;

import com.example.demo.mapper.UserMapper;
import com.example.demo.user.model.User;
import com.example.demo.user.service.UserService;

@Service
public class UserServiceImpl implements UserService {

	private UserMapper userMapper;

	public UserServiceImpl(UserMapper userMapper) {
		this.userMapper = userMapper;
	}

	@Override
	public List<User> getAllUser() throws Exception {
		List<User> list = userMapper.getAllUsers();
		return list;
	}

}

설정을 완료하였고, 이제 Mybatis를 사용할 수 있다

 

데이터베이스 연결 부분에서 문제가 생길 수도 있다. 계정과 권한을 확인해야 한다. (아래 참고링크 확인)

계정을 새로 만들었다면, 데이터베이스에 대한 권한을 부여해야 한다

 

그리고 DateTime 타입의 컬럼을 조회했을 때,  (실제 DB 값에는 T 문자가 없음에도 불구하고) "2023-09-10T 02:00:13"이라고 나올 수 있다

package com.example.demo.user.model;

import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

@Data
public class User {
	String id;
	String password;
	String name;
	int age;

	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	LocalDateTime createDt;
	
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	LocalDateTime updateDt;
	
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	LocalDateTime deleteDt;
}

@JsonFormat을 사용하면 API 결과 값에서 T가 제거된 것을 확인할 수 있다


참고 링크

 

mybatis-spring-boot-autoconfigure – Introduction

Introduction Translations Users can read about MyBatis-Spring-Boot-Starter in the following translations: What is MyBatis-Spring-Boot-Starter? The MyBatis-Spring-Boot-Starter help you build quickly MyBatis applications on top of the Spring Boot. By using t

mybatis.org

 

mysql 사용자추가/DB생성/권한부여

서버 관리를 하다보면 mysql 사용자 계정을 추가해 줄때가 있다. MySQL 접속 및 데이터 베이스 추가# mysql -u root -p 사용자 계정을 추가하기 전에 먼저 현재 생성된 사용자 계정을 확인한다. mysql > use

nickjoit.tistory.com

'JAVA > Spring' 카테고리의 다른 글

[Springboot] MVC 패턴과 폴더 구조  (0) 2023.09.04
[Springboot] Lombok  (0) 2023.09.04
[Springboot] 스프링부트 시작하기  (0) 2023.09.03

MVC 패턴?

 

Model, View, Controller 의 앞글자를 딴 디자인 패턴이다. 

 

 

Model, 모델

  • 데이터를 처리하는 영역 (데이터와 비즈니스 로직을 관리)
  • 데이터베이스 연동을 위한 DAO (Data Access Object)와 데이터 구조를 표현하는 DO (Data Object)로 구성

 

View, 뷰

  • 사용자에게 정보를 표시하는 역할
  • 웹 사이트, 어플과 같은 사용자 인터페이스 (UI)를 의미
  • 별도의 데이터를 보관하지 않음

 

Controller, 컨트롤러

  • 모델과 뷰 사이에서 브릿지(bridge) 역할을 수행
  • 사용자의 요청은 모두 컨트롤러를 통해 진행되어야 함

특 징

  • 어플리케이션의 역할을 세 가지 주요 부분으로 나누어 설계함으로써 서로 간의 의존성이 낮아짐
  • 독립적인 각 부분은 영향을 주지 않기 때문에, 유지 보수와 테스트하기 용이하고, 개발자 간 분업 및 협업이 원활해짐

 

단 점

  • 간단한 프로젝트에 MVC 패턴을 도입하는 것은 오버헤드일 수 있다. 모델-뷰-컨트롤러로 분리하는 구조는 큰 프로젝트에 더 유용하며, 작은 프로젝트에서는 과도한 구조화일 수 있다
  • 컨트롤러의 역할이 너무 커져 복잡해질 수 있다. "Massive-View-Controller" MVC 패턴을 구현할 때 발생하는 문제 중 하나를 가리키는 용어이다. 
    1. 다수의 뷰와 모델들이 컨트롤러를 통해 연결되기 때문에 컨트롤러가 많은 책임을 가질 수 있다
    2. 코드 가독성이 떨어지기 때문에, 유지 보수와 확장을 어렵게 만든다

 

 


MVC 프로젝트의 폴더 구조

  • src
    • main
      • java
        •  com/example/demo
          • user
            • controller    # 컨트롤러
            • service        # 서비스
              • impl
            • model          # 모델
          • board
            • controller
            • service
              • impl
            • model
          • DemoApplication.java  # 스프링 부트 애플리케이션의 시작점
    • resources
      • mybtis
        • mapper
    • webapp
      • WEB-INF
        • views   # (User Interface)

 

폴더 구조는 정해진 것은 없기 때문에, 다양하게 구조화할 수 있다

모델 부분에서는 vo / dto / repository 패키지로도 구성할 수 있지만, 나는 model 패키지로 구성하려 한다

그리고 MyBatis / JPA 를 사용하는지에 따라서도 다르게 구성되는 것 같다

 


참고 링크

 

 

[Design Pattern] 1. MVC 패턴

디자인 패턴

jooncco.com

 

MVC(Model, View, Controller) Pattern

<br /><br />

junhyunny.github.io

 

'JAVA > Spring' 카테고리의 다른 글

[Springboot] MyBatis (feat. MySQL)  (1) 2023.09.11
[Springboot] Lombok  (0) 2023.09.04
[Springboot] 스프링부트 시작하기  (0) 2023.09.03

Lombok (롬복)@(annotation, 어노테이션) 사용하여 코드를 줄여주고 간소화해주는 인기 있고 널리 사용되는 라이브러리

 

  1. 코드 간결성: Getter, Setter, toString 등과 같은 반복적인 코드를 자동으로 생성하여 코드의 양을 줄여준다. 이로 인해 코드가 더 간결해지고 가독성이 좋아진다
  2. 생산성: 반복적인 작업을 줄일 수 있으므로, 생산성을 향상시킨다
  3. 유지 보수성: 코드 중복을 줄여주고 일관된 코드 스타일을 유지하도록 도와주기 때문에, 유지 보수가 더 쉬워진다

Annotation 종류

 

@Getter / @Setter

import lombok.Getter;
import lombok.Setter;

@Getter
public class User {
	@Setter String id;
	@Getter @Setter String name;
	int age;
}

class 전체에 부여할 수 있고, 컬럼에도 사용이 가능하다

 


@ToString

import lombok.ToString;

@ToString
public class User {
	String id;
	String name;
	int age;
}

클래스의 toString() 메서드를 자동으로 생성하여 객체의 문자열을 만든다

 


@EqualsAndHashCode

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
	String id;
	String name;
	int age;
}

equals()와 hashCode() 메서드를 생성한다. 객체의 내용을 비교하고 해싱할 수 있으므로 동등성 비교와 해시 테이블에서의 사용이 용이해진다.

나는 의문이 들었다. 기본 Object 객체에도 equals()hashCode()가 존재하는데 lombok@EqualsAndHashCode는 뭐가 다르다고 하는걸까?

		User user1 = new User();
		user1.setId("userId");

		User user2 = new User();
		user2.setId("userId");

		System.out.println(user1.hashCode());
		System.out.println(user2.hashCode());
		System.out.println(user1.equals(user2));

@EqualsAndHashCode 어노테이션을 사용하지 않았다면 (Object 객체의 hashCode(), equals() 함수 사용했다면), 두 객체의 hashCode가 다르게 나오고 equals() 함수는 false를 리턴한다.

→ Java의 Object 객체의 함수는 객체의 참조 (메모리 주소) 기반으로 동작하기 때문이다

 

하지만 어노테이션을 사용했다면, 두 객체의 hashCode 값은 동일하고, equals() 함수는 true를 리턴한다.

Lombok 어노테이션은 메모리 주소를 참조하는 것이 아니라, 객체의 내용을 비교하기 때문이다

 

@EqualsAndHashCode(exclude = {"name", "age"})

위와 같이 선언하면 name, age 컬럼 내용은 제외하고 id 컬럼의 값만 비교하겠다는 뜻이 된다.

@EqualsAndHashCode(of = {"id"})

id 값만 비교하겠다는 뜻이다. 위와 동일하다.  이 외에도 callSuper, onParam 등 여러가지 속성이 있다고 한다.

 

 

어노테이션 (그리고 속성) 선언만으로도, hashCode() equals() 함수를 오버라이드하여 작성하는 수고를 줄여준다.


@AllArgsConstructor / @NoArgsConstructor

 

생성자를 자동으로 생성하는 어노테이션이다.

@AllArgsConstructor는 모든 컬럼(필드)를 인자로 받는 생성자를 생성한다.

 

@NoArgsConstructor는 파라미터 없는 기본 생성자를 생성한다

@NoArgsConstructor(force=true)

옵션을 사용하면, 사용자 정의 생성자가 이미 존재하는 경우에도 기본 생성자를 강제로 생성한다.

또한 컬럼(필드) 값들을 null, 0, false 등과 같은 값으로 초기화 시켜준다


@Builder

 

		User user = User.builder()
					.id("userId")
					.name("userName")
					.age(10)
					.build();

선언만으로도, 빌더 패턴을 생성하여 객체를 쉽게 생성할 수 있도록 해준다


@Data

 

@Getter, @Setter, @EqualsAndHashCode, @ToString 의 어노테이션을 한 번에 적용할 수 있다

 


@Slf4j

 

@Slf4j
@RestController
@RequestMapping("user")
public class UserController {

	@Autowired
	private UserService userService;

	@GetMapping("all")
	public List<String> getAllUser() throws Exception {

		User user = User.builder()
					.id("userId")
					.name("userName")
					.age(10)
					.build();
		
		log.info(user.toString());
		
		
		return userService.getAllUser();
	}

}

SLF4J(Logger)를 사용할 수 있다

 


Lombok 설치

 

Download

 

projectlombok.org

Lombok 파일을 다운로드 받고, 파일이 있는 위치로 가서 java -jar 명령어를 실행
Install / Update. Eclipse가 실행되어있다면 재시작

https://mvnrepository.com/artifact/org.projectlombok/lombok

적당한 버전의 Lombok을 선택합니다. 제 프로젝트는 gradle로 생성했습니다

compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.16.10' 의 내용을 프로젝트 build.gradle의 dependencies 안에 추가해줍니다.

Project 우 클릭 - Gradle - Refresh Gradle Project
lombok 라이브러리가 추가된 것을 확인

 

'JAVA > Spring' 카테고리의 다른 글

[Springboot] MyBatis (feat. MySQL)  (1) 2023.09.11
[Springboot] MVC 패턴과 폴더 구조  (0) 2023.09.04
[Springboot] 스프링부트 시작하기  (0) 2023.09.03
 

Eclipse Downloads | The Eclipse Foundation

The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 415 open source projects, including runtimes, tools and frameworks.

www.eclipse.org

Help - Eclipse Marketplace
Spring Tools 4 - Install
Confirm
I accept the terms of the license agreements - Finish
체크 박스 클릭 - Trust Selected
체크 박스 클릭 - Trust Selected
Restart Now
Spring Starter Project
Next
필요한 것들은 나중에 추가해보자. Spring Boot DevTools, Spring Web 체크 후, Finish

 

Project 우 클릭 - Run As - Spring Boot App 클릭하여 서버 실행
8080 포트로 서버 실행


Springboot 개발 환경 구축이 끝났다. 개발을 시작해보자

  1. Lombok
  2. MVC Pattern
  3. MyBatis
  4. yaml
  5. RestAPI
  6. Logging
  7. Batch
  8. + + + + +

'JAVA > Spring' 카테고리의 다른 글

[Springboot] MyBatis (feat. MySQL)  (1) 2023.09.11
[Springboot] MVC 패턴과 폴더 구조  (0) 2023.09.04
[Springboot] Lombok  (0) 2023.09.04

+ Recent posts