(몇 주 전에 올렸는데 왜 노출이 안 됐지..ㅠ)
연수가 끝난 후 본격 부서에 배치된 박주디.
첫 주는 하루에 3잔씩 음료를 얻어먹고, 매일매일 인사하기 바쁘다. 다행히 나는 하루 만에 개발망 피씨를 받았다.
딱히 하는 일이 없었는지 어언 3주. 그리고 그녀에게 곧 서버 개발이 주어질 것이라는 예고장이 날아오는데..
🥷 : 다음 주에 간단한 개발 건 정리해서 드릴게요. 프로젝트 많이 해보셨어요?
🐰주디 : ㅇ..예..! 자.. 자신 있습니다..!
🤖 : 야! 너 개발 환경 세팅받아서 코드 본 지 2시간이고, 권한 받은 지도 2시간이잖아.
그리고 너 MyBatis 해봤어? JPA만 했잖아. 너 Maven 써봤어? Gradle 썼잖아. 너 SVN 써봤어? 너 Git만 썼잖아.
너 폐쇄방에서 개발해 봤어? 너 검색 충이잖아.
(하놔... 깨알 에피소드로 폐쇄망이라 크롬 설치할 줄 몰라서 3주 동안 엣지 브라우저 사용함..ㅎ 나중에 설치하는 방법을 알아버렸..)
🐰 주디 : 야야.. 그만 패.. 알잖아 나 야생마인 거. 일단 할 수 있다 하고 냅다 하는 거야. 그게 인생이라고(?)
그래도 3주 동안 기획서랑.. 엑셀표만 정리하다가... 개발 코드 보니깐 반갑다.
(엑셀도 사실 시키신 일은 아닌데 심심해서 했다!)
비록 나의 사랑 인텔리제이와 헤어지고 이클립스를 부여받았지만 장인은 도구를 탓하지 않는다.
아니.. 조금 탓한다.
(이클립스 왜인지 느려서 화나 ㅜ 근데 나중에 방법을 찾았다 우훗)
생각보다 일반 기업에서는 해당 기술스택들을 아직도 많이 사용한다.
이런 기술들을 사용하는 시닙이들에게도 도움이 되는 글이 되길 바라며
출~ 발~
0. 데이터 접근 기술
- JDBC: 데이터베이스에 접근하기 위한 Java 표준 API
- JDBC Template: JDBC를 효율적으로 사용하기 위한 Spring API
- SQL Mapper
- SQL과 Java 객체를 매핑하는 기술
- SQL의 input 또는 output을 Java 객체와 매핑
- 일반적으로 MyBatis가 사용된다. - ORM
- RDBMS의 테이블과 Java 객체를 매핑하는 기술
- ORM Framework 객체와 테이블을 매핑하는 역할 수행
- ORM Framework가 SQL을 자동 생성
- 주로 Hibernate와 Spring Data JPA 사용된다.
1. 환경 설정
⚙️ 프로젝트 환경
- java : 11
- Spring Boot : 2.7.17
- Build Tool: Maven
- Data Access Layer: MyBatis
우선 간단하게 실습해 볼 거라 https://start.spring.io/해당 사이트에서 환경을 구성했다.
대충 필요할 거 같은 롬복 같은 라이브러리만 받아서 다운받았다.
🪽 Maven : pom.xml 설정
Maven은 Build Tool 중 하나이다. 자세한 이야기는 아래 내 포스팅에서 작성한 적이 있다. (물론 주인공은 Gradle이었던,,)
👉 [Java] Gradle.. Gradle 말입니다. 자바 빌드 도구 🐘
maven은 pom.xml 파일로 의존성을 관리한다.
dependency 태그에 외부 라이브러리의 정보를 입력해 준다.
기본적으로
- Spring Web
- Spring Validation
- h2 database
- Lombok
- MyBatis
추가하자!
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>2.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
🌱 Spring 설정과 H2 DB 활용
h2 web console로 접속해서 사용한다. (간단하게 실습할 거라 h2를 활용했다.)
✔️ application.yml
yml 파일을 작성해 준다.
server:
port: 8080
spring:
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:~/todo
username: sa
password: 1234
driver-class-name: org.h2.Driver
sql:
init:
mode: always
✔️ DB 테이블 초기화
Spring 프로젝트가 실행될 때 테이블이 생성되도록
resources > schema.sql 파일을 만들어줬다.
DROP TABLE IF EXISTS todo;
CREATE TABLE todo
(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(255) NOT NULL,
isCompleted CHARACTER NOT NULL
);
✔️ DB 테이블 데이터 초기화
resources > data.sql을 생성해서 값을 넣어준다.
INSERT INTO TODO (CONTENT, ISCOMPLETED) values ('Study Spring', 'N');
INSERT INTO TODO (CONTENT, ISCOMPLETED) values ('Study MyBatis', 'N');
✔️ Spring Boot 실행
http://localhost:8080/h2-console 로 접속하자.
[ 데이터베이스 파일 생성 방법 ]
- jdbc:h2:~/todo (최소 한번)
-이후 부터는 jdbc:h2:tcp://localhost/~/todo 이렇게 접속
그리고 확인해 보면 테이블이 생성되었고, 데이터도 들어간 걸 확인할 수 있다.
🕊️ MyBatis 설정
MyBatis란? 데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기 위해 xml로 구조화하여 Mapper 설정 파일을 통해서 JDBC를 구현한 영속성 프레임 워크
아래 설정을 통해 config 파일 위치를 명시해 준다.
- application.yml
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
- mybatis-config.xml (MyBatis 설정 파일)
- mappers : mapper.xml 파일 연결
mapper.xml 경로를 resourse로 연결
- mappers : mapper.xml 파일 연결
mybatis에서 사용될 DB를 연동하기 위한 설정값들과 mapper.xml을 등록하기 위한 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>
- todo-mapper.xml
mybatis에서 사용될 SQL 구문을 담고 있는 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.mybatis.mapper.TodoMapper">
<insert id="save">
INSERT INTO TODO (CONTENT, ISCOMPLETED)
VALUES(#{todo.content},#{todo.isCompleted});
</insert>
</mapper>
2. Todo 저장 API 구현
간단하게 만들어보자!
1) Todo 추가 DTO
import lombok.Data;
@Data
public class addTodoRequest {
private String content;
private String isCompleted;
}
2) Controller
@RestController
@RequiredArgsConstructor
public class TodoController {
private final TodoService todoServiceImpl;
@PostMapping("/todo")
public void addTodo(
@RequestBody AddTodoRequest request
) {
todoServiceImpl.addTodo(request);
}
}
3) Service
@Service
@RequiredArgsConstructor
public class TodoServiceImpl implements TodoService {
private final TodoMapper todoMapper;
@Override
public void addTodo(addTodoRequest request) {
todoMapper.save(request);
}
}
4) Mapper interface
@Mapper
public interface TodoMapper {
void save(addTodoRequest request);
}
5) todo-mapper.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.mybatis.mapper.TodoMapper">
<insert id="save" parameterType="AddTodoRequest">
INSERT INTO TODO (CONTENT, ISCOMPLETED)
VALUES (#{content}, #{isCompleted});
</insert>
</mapper>
✔️ <mapper> 태그
namespace 속성에 Mapper Interface 경로를 선언해 주어 Mapper Interface와 XML Mapper를 연결한다.
✔️ 쿼리 (select, insert, update, delete)
mapper 태그 내 SQL들이 실행된다.
이때 Mapper Interface는 메서드 명과 동일한 id를 가진 XML Mapper를 찾기 때문에 반드시 이름이 같아야 한다.
✔️ parameterType
쿼리에서 사용되는 파라미터의 타입이다. 일반적으로 객체로 받아 쿼리를 실행한다.
✔️ resultType
쿼리의 실행 결과를 매핑할 결과 타입이다.
✔️ #{ } 표현식(바인드)과 ${ } 표현식(리터럴)
[ ${ } - 리터럴 ]
파라미터 값을 그대로 문자열 치환하여 SQL 쿼리에 삽입한다. 이것은 리터럴 값처럼 처리된다.
그래서 SQL 인젝션 공격에 취약하다.
[ #{ } - 바인드 ]
파라미터 값을 JDBC PreparedStatement 매개변수로 처리한다.
즉, 입력값을 안전하게 처리하고 SQL 쿼리를 실행하는 데 사용됩니다.
- 단일 데이터 : #{_parameter}
- 다중 데이터 : map이나 vo 활용
정말 간단하게 MyBatis에 대해 알아봤다. 전반적으로 감은 잡았으니 실제 업무하면서 또 포스팅 작성해야겠다.
빠잉~ 퇴근하자
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
다시 돌아온 병아리 신입 주디 #1 Batch 처리에 대해 알아보자 🫧 (2) | 2024.03.24 |
---|---|
[AWS S3+Lambda] 이미지 처리 2탄: Image Resizing으로 썸네일 이미지 만들기 (0) | 2023.06.28 |
[AWS S3] 이미지 처리 1탄: Pre-signed URL로 파일 업로드 구현 (0) | 2023.06.27 |
[JPA] 1차 캐시(First-Level Cache), 2차 캐시(Second-Level Cache) (0) | 2023.06.25 |
댓글