Develop

30일차_Spring-MyBatis 실습 정리: 테스트 코드, 매핑, 회원가입 구현 본문

백엔드/KDT_Programmers

30일차_Spring-MyBatis 실습 정리: 테스트 코드, 매핑, 회원가입 구현

230801 2025. 4. 16. 01:41

 

안녕하세요 .ᐟ

4/14(월) 데브코스 30일차(7주 1일차) 입니다.

 

오늘은 스프링에서 테스트 케이스를 작성해서 테스트도 해보고, 마이바티스 매핑에 대해서 학습했습니다.

 

 

 


 

테스트 케이스 작성

테스트 클래스 자동 생성

  • JUnit5와 Spring Boot Test를 활용해 테스트 클래스를 자동으로 생성
    • 윈도우 : Ctrl + Shift + T
    • 맥 : Command + N

스프링과 JUnit5 통합

@ExtendWith(SpringExtension.class)

  • JUnit5 테스트 클래스에 스프링 컨텍스트를 로딩함
  • 이 설정을 통해 스프링 빈을 사용할 수 있게 됨

설정 파일 명시

@ContextConfiguration(...)

  • 명시적으로 설정 파일을 지정할 수 있음
  • 테스트 환경에 따라 필요한 설정 파일만 로드할 수 있다는 장점이 있음

테스트 메서드 작성 규칙

@Test

  • public void 형태로 작성

스프링 빈 로딩 확인

  • 테스트 실행 시 출력되는 로그를 통해 확인
  • 이를 통해 빈 설정이나 의존성 주입이 제대로 이루어졌는지 점검 가능

 


 

 

MyBatis 매핑

매핑 규칙

  • Mapper XML 또는 @Mapper 인터페이스 사용 시 SQL 쿼리의 id는 Java 메서드명과 일치해야 함
    • 예시 : id=findByIdfindById()를 `bkIdx`로 일치시킴
  • java
// BookRepository.java
Book findById(int bkIdx);

 

  • xml
<!-- bookMapper.xml -->
<select id="findById" resultType="Book">
  SELECT * FROM book WHERE bk_idx = #{bkIdx}
</select>

 

인터페이스 메서드에 매개변수가 하나일 때

  • #{}를 사용하여 매개변수를 바인딩
    • 예시:
@Select("select * from book where bk_idx = #{bkIdx}")

 

 


 

복잡한 쿼리 관리

XML 분리

  • 복잡한 쿼리는 resources의 XML 파일로 분리하여 관리함
  • 결과 매핑 처리 태그
    • 1대다 관계 : <collection>
    • 1대1  관계 : <association>

 

 

동적 쿼리

동적 쿼리 태그

  • if, choose-when, where, trim, foreach : XML에서 활용하여 조건부 쿼리 작성
  • where : 조건이 없을 경우 자동으로 제거되어 쿼리 오류 방지

조건부 쿼리 및 반복문 처리

  • foreach : 리스트 형태의 데이터를 반복적으로 처리
  • insert, update 등 : bulk 작업 시 유용하게 사용

Like 문 작성

  • concat 함수를 사용하여 동적 like 문 작성
    • Like 문 : 사용자가 입력한 값에 따라 SQL 이 동적으로 바뀌어야 할 때 사용 
      • % : 위치에 따라 문자열로 시작/끝나는 값을 찾거나, 포함하는 값을 찾을 때 사용
LIKE '자바' 정확히 “자바”만 찾음
LIKE '%자바' “자바”로 끝나는 값 (예: “초급 자바”)
LIKE '자바%' “자바”로 시작하는 값 (예: “자바 기초”)
LIKE '%자바%' “자바”가 포함된 값 (예: “자바의 정석”, “초급 자바 가이드”)

 

  • concat 함수 : 문자열을 이어붙여줌 (% + 검색어 + %)
  • 예시:
@Select("select * from book where title like concat('%', #{title}, '%')")

 

 


 

MemberService - 회원가입 아이디 중복 체크

중복 체크 구현

  • Controller
    • 폼 입력값에 대해 유효성 검증을 수행 (@NotBlank, @Size, @Email 등) 하고,
    • DTO로 변환한 데이터를 서비스로 전달
    • BindingResult를 통해 검증 실패 시 폼으로 돌아가고, 성공 시 회원가입 로직을 진행함
  • Service
    • 회원가입 시 아이디의 중복 여부를 서비스 단에서 검증
    • @Transactional을 통해 트랜잭션을 관리
    • MemberRepository.existsMember()를 호출하여 중복 여부를 확인함
      • 중복일 경우          : CommonException으로 예외 처리
      • 중복이 아닐 경우  : insertInfo() 메서드를 통해 회원 정보를 저장

 

 

 

오늘도 수고하셨습니다~