📌Mybatis : SQL Mapper
개발자가 작성한 SQL 실행 결과를 객체에 ‘매핑’시켜주는 프레임워크이다. MyBatis에서 Java 메소드와 SQL 간에 매핑을 시키기 때문에 개발자는 Java 메소드 선언과 SQL 문만 만들면 MyBatis가 자동으로 그 둘 간을 연결시켜 주게 된다.
웹 개발자 vs. 소프트웨어 개발자, 둘 중 더 나은 커리어 선택은 무엇일까요? | 이랜서 블로그
‘개발자 모셔가기'라는 말이 나올 정도로 채용 시장에서 개발자에 대한 수요는 치솟고 있습니다. ‘웹 개발자’와 ‘소프트웨어 개발자’의 차이점과 성공적인 커리어를 위해 필요한 역량을
www.elancer.co.kr
기본 폴더 구조이다.
main 을 시작점으로 java , resources 로 폴더가 나뉜다.
config, controller, service 는 기본적으로 jpa 와 동일하다.
차근 차근 과정을 따라 가 보자.
먼저 resources 파일을 살펴보면 mapper, static, templates 가 보일 것이다. 이중 static 은 정적 파일 (ex css) 등을 넣어주는 곳임으로 신경 쓰지 않아도 된다. templates 또한 mvc 패턴 사용시 html 을 넣어주는 공간 임으로 제외하면
mapper 가 남는다.
📌mapper 란?
sql 과 자바를 이어주는 징검다리 역할을 하는 파일이라 보면 된다. 말 그대로 mapper 이다. 우리는 mapper 를 통해 sql 코드를 작성하고 해당 sql 문에 이름을 붙여 java 의 함수로 만들 것이다.
📌DAO, DTO, VO 의 차이
DAO (data access object) : 데이터 접근을 위한 객체이다. 전동적인 jdbc 에서는 커넥션을 직접 관리해야 했음으로 dao 객체를 사용해서 데이터에 접근했지만 mybatis 가 해당 기능들을 모두 지원하기 때문에 지금은 쓰이지 않는다.
VO (value object) : 데이터 값을 나타내는 객체이다. 데이터의 불변성을 유지하기 위해 사용되며 불변임으로 read only, getter 만 가진다.
DTO (data transfer object) : 데이터 이동을 위한 객체이다. getter, setter 만 가지며 계층간 데이터 이동을 위해 존재한다. ex) 파라미터로 전달받은 객체 → dto 화 시켜서 → service에 전달 → service가 mapper에 dto 전달 → insert 돼야 하는 객체라면 ? toEntity 객체를 통해 vo 로 바꿔서 insert
📌예제
먼저 main/java/domain 에 dto 와 vo 폴더를 생성해주고 vo 는 db 와 똑같이 dto 는 담아올 객체에 알맞게 domain/dto/chiild.java 등의 이름으로 class 를 생성 해 준다.
dto
이때 dto 의 생성자 위에 @builder 어노테이션을 붙이면 객체 생성시 빌드패턴으로 객체를 생성할 수 있다.
builder는 유연한 객체의 생성을 가능하게 한다.
즉 위의 예시에서 따로 questionNumber, questionTitle 만 받아서 초기화하는 생성자를 만들어 두지 않아도 빌드패턴으로 두개의 값만 받아서 객체를 생성할 수 있다.
- 나머지는 자동으로 기본값 or null 이 들어감
vo
데이터 베이스 테이블과 동일하게 만들어 준다고 생각하면 된다. Long은 정수를 의미한다.
이제 resources/mapper 로 가서 xml 파일을 생성해 보자.
kidMapper 이름으로 resources/mapper 에 kidMapper.xml 파일을 하나 만들어 주고 내용을 작성 해 준다.
여기서 .xml 이란 데이터를 구조화 하기 위한 마크업 언어라고 생각 하면 된다.
<?xml version="1.0" encoding="UTF-8"?>
https://mybatis.org//DTD>) Mapper 3.0//EN" "<http://mybatis.org/dtd/mybatis-3-mapper.dtd>">
이부분은 세팅이다. 다른 코드는 조금이따 설명하겠다.
메퍼란? sql 과 자바를 이어주는 징검다리 즉 orm 함수를 만드는 역할이라 했다. 그렇다면 어떻게 xml 파일을 java 와 맵핑 시킬까?
앞의 폴더구조를 다시 보자.
main/java 폴더에도 똑같이 mapper 폴더가 있는 것을 볼 수 있다. resources/mapper 가 데이터베이스 → java/mapper 가 자바의 orm 함수라고 이해하면 편할 것이다.
결국 같은 mapper 파일을 만들어 두 mapper 를 연결시켜 주는 것이다.
mapper/myPagemapper 파일을 생성해주고 KidsMapper 즉, “위와 같은” 이름으로 java 파일을 생성 해 준다.
위의 resources/mapper/kidsMapper.xml 파일을 다시보자.
<mapper namespace="com.example.idollbom.mapper.myPagemapper.parentmapper.KidsMapper">
라고 메퍼의 이름을 정의한 코드가 있다. 이때 메퍼의 이름을 mapper/myPagemapper/kidsMapper.java 의 경로 이름으로 지정해 해당 java 파일과 xml 파일을 연결 해준다.
<!-- 아이추가 --> <insert id="insertKids"> insert into child values (seq_project.NEXTVAL,#{childName},#{childAge},#{childGender},#{childSpecialIssues},#{parentNumber}) </insert>
xml 파일에서는 DML을 < > 태그 안에 넣어서 표시한다. 여기서 id 는 우리가 쓸 orm 함수의 이름이라 생각하면 된다. 나머지 sql 문은동일하다. 단, 외부에서 파라미터로 받아올 값들은 #{} 로 표시해 준다.
다시 java/mapper 파일을 살펴보자. 우리는 앞에서 xml 파일로 java 파일과 해당파일 연결, sql문 작성, 해당 sql 문을 함수화 시킬 이름 붙이기 작업을 해 주었다.
@Mapper public interface KidsMapper { // 아이 등록 void insertKids(kidVO kidVO); // xml 의 id 이름과 함수 이름은 동일하게 !!
먼저 만든 java 파일에 어노테이션 @Mapper 를 붙여주고 인터페이스 안에 xml 에서 id 로 이름붙여준 이름으로 함수를 생성 해 주면 된다.
void insertKids(kidVO kidVO); 함수를 설명하자면 kidVO 를 객체로 받고 return 값이 없는 함수이다. 인터페이스 임으로 내부구현은 필요 없다. (구현은 xml 을 구현이라 생각하면 된다. 해당 함수는 단지 xml 파일 내의 내용을 자바에서 사용하기 위해 만든 인터페이스일 뿐이다.)
이후 서비스를 작성 → 컨트롤러에서 해당 서비스를 사용하여 데이터를 insert 해 준다.
나머지 과정들은 jpa 와 동일하다.
'밍개발일지' 카테고리의 다른 글
s3 권한설정 (0) | 2025.04.05 |
---|---|
멋사 13기 운영진 지원 후기 (1) | 2025.01.28 |
커밋 컨벤션 (1) | 2024.12.30 |
gitHubFlow 전략 (2) | 2024.12.30 |
기계어와 바이트코드 (0) | 2024.10.11 |