DTO 생성자 표준은 「생성자로만 만든다」는 규칙에 예외를 둘만 뒀고, 그중 하나가 MyBatis다.
MyBatis는 기본적으로 기본 생성자 + setter/필드 주입으로 결과를 매핑한다.
생성자 매핑을 쓰려면 resultMap 의 <constructor> 나 별도 설정이 필요한데,
이 표준은 그 설정을 도입하지 않고 예외로 둔다.
이 문장이 MapperResult에만 @Setter·@NoArgsConstructor를 허용하는 근거다. 설정 없이는 정말 안 되는지 쟀다.
주장 — 기본 생성자와 setter가 없으면 매핑하지 못한다
MyBatis는 기본 생성자와 setter가 없으면 조회 결과를 매핑하지 못한다.
근거 종류는 1(기술 사실)이다.
반증 조건 — 둘 중 하나라도 채워지면 반증이다
- refuted — (가)나 (나) 중 하나라도 예외 없이 값이 채워진다
- supported — (가)와 (나) 둘 다 실패하고 대조군만 채워진다
- inconclusive — 대조군도 실패한다(설정이 틀린 것이다)
설계 — 같은 조회에 결과 타입만 바꿔 끼운다
(대조군) 기본 생성자 + setter 표준이 예외로 허용한 모양
(가) final 필드 + 전 인자 생성자만 기본 생성자도 setter도 없다
(나) 기본 생성자 + private 필드 setter 가 없다
resultMap의 <constructor>를 쓰지 않고 결과 타입만 지정했다 — 표준이 「설정을 도입하지 않는다」고 한 그 상태다. 컬럼 이름은 필드 이름과 같게 뒀다. 이름 매핑까지 변수로 만들면 무엇 때문에 실패했는지 갈리지 않는다.
DB는 로컬 PostgreSQL 17이고 실험 전용 데이터베이스를 만들고 지웠다. MyBatis 3.5.17(mybatis-spring-boot-starter 3.0.4), Spring Boot 3.5.16이다.
결과 — 셋 다 채워졌다
PROBE boot=3.5.16 mybatis=3.5.17 mybatis_spring=3.0.4
control=ok:filled:1,alpha,700
ctor_only=ok:filled:1,alpha,700
no_setter=ok:filled:1,alpha,700
판정은 refuted다. final 필드에 전 인자 생성자만 둔 타입도, setter가 없는 타입도 예외 없이 모든 필드가 찼다.
예상과 달랐던 점 — 표준 글의 서술과 반증 조건이 가리키는 곳이 다르다
표준 글의 원문은 「기본 생성자 + setter/필드 주입」이다. 필드 주입까지 적혀 있으므로 (나)가 성공한 것은 글과 어긋나지 않는다. 뒤집힌 것은 (가)다 — 기본 생성자가 아예 없는 타입이 매핑됐다.
그래서 이 결과가 흔드는 것은 정확히 이 지점이다.
| 표준 글이 말한 것 | 실측 |
|---|---|
| setter나 필드 주입으로 채운다 | (나)에서 맞다 |
생성자 매핑은 <constructor> 설정이 있어야 한다 |
틀렸다. (가)가 설정 없이 됐다 |
그래서 MapperResult에 기본 생성자와 setter를 허용한다 |
근거가 사라졌다 |
왜 됐는지는 이 실험이 재지 않았다. 생성자 자동 매핑인지 필드 리플렉션인지는 측정한 것이 아니라 추정이라 결과에 적지 않았다.
이 결과가 표준에 남기는 것 — 예외를 없앨 수 있는지가 쟁점이 된다
이 실험은 앞의 다른 결과들과 성격이 다르다. 근거 문장만 흔들린 게 아니라 예외 조항 자체가 필요 없어질 수 있다. MapperResult도 다른 DTO처럼 final 필드와 생성자만으로 둘 수 있다면, 「금지 목록의 유일한 구멍」이 사라진다.
규칙은 바로 고치지 않는다. 표준 글에 > 반증: 줄을 달고 kind: 모순 이슈에서 예외를 없앨지, 없앤다면 어느 조건에서 깨지는지를 따진다. MyBatis 버전이 올라가며 동작이 달라질 여지도 그 자리에서 확인해야 한다.
정리
- 세 타입 모두 설정 없이 채워졌다.
final필드 + 전 인자 생성자만 둔 타입 포함 - 「
<constructor>설정이 있어야 생성자 매핑이 된다」가 틀렸다 MapperResult예외 조항의 근거가 사라졌다. 없앨지는 모순 이슈에서 정한다- 재지 않은 것 — 매핑이 성공한 기전, 다른 MyBatis 버전, 컬럼 이름이 다를 때
자신만의 철학을 만들어가는 중입니다.
댓글남기기