본문 바로가기

두두의 IT/Spring

Spring Boot Mapper & Dao Annotation

728x90

스프링 빈 컨테이너에서 관리한다는 것은 개발자가 직접 인스턴스를 생성하지 않는다는 것을 의미합니다.

스프링 빈 컨테이너가 인스턴스를 생성해 관리한다는 것을 뜻합니다.

스프링 빈 컨테이너가 CalculatorService클래스를 찾아 빈으로 등록할 수 있도록 클래스 위에 @Component를 붙입니다.

스프링 빈 컨테이너를 사용할 때는 개발자가 직접 인스턴스를 생성하면 안됩니다.


@Mapper
@Select("SELECT * FROM xxx WHERE xxx")
@Update("UPDATE xxx SET xxx WHERE xxx")
@Results(id = "xxx", value = {
        @Result(property = "xxx", column = "xxx"),
        @Result(
                property = "xxx",
                column = "xxx",
                javaType = xxx.class,
                one = @One(select = "xxx", fetchType = FetchType.EAGER)
                many = @Many(select = "xxx")
        )
})
@Param("xxx") String xxx
@Delete("DELETE FROM xxx WHERE xxx")
@ResultMap("xxx")

 

@Mapper

  • Spring IoC 컨테이너에 서비스 Bean으로 등록되며 Service단에서 Autowired하여 사용할 수 있음
  • 메서드명은 추후 Mapper.xml 파일의 id와 동일하게 매핑시켜 편리하게 사용
  • 해당 인터페이스에 등록된 SQL Annotation을 토대로 실제 SQL문을 실행시켜 준다.
  • 3이상 버전부터 mapper.xml 대신 interface 클래스의 Annotation을 통해 SQL을 사용할 수 있다.


@Select("SELECT * FROM xxx WHERE xxx")

  • ${   }는 Key를 나타내는 것으로써 '' 같은 싱글 쿼테이션이 들어가지 않으며,
  • #{   }는 Value를 나타내는 것으로 싱글쿼테이션으로 감싸진다.


@Update("UPDATE xxx SET xxx WHERE xxx")
@Results(id = "xxx", value = {
        @Result(property = "xxx", column = "xxx"),
        @Result(
                property = "xxx",
                column = "xxx",
                javaType = xxx.class,
                one = @One(select = "xxx", fetchType = FetchType.EAGER)
                many = @Many(select = "xxx")
        )
})

  • DB의 칼럼명칭과 Java 에서 만든 class의 변수명이 일치하지 않는 경우가 있을 때, SQL Mapper인 MyBatis를 사용해서 SQL 문법을 만들 떄 직접 매핑을 시켜주는 코드


@Param("xxx") String xxx


@Delete("DELETE FROM xxx WHERE xxx")


@ResultMap("xxx")

  • 매핑이 필요한 SQL 메서드 ID 선언
  • 해당 메서드를 불러올 때 xxx 테이블의 칼럼과 property가 서로 매핑되어서 정확한 데이터를 가져오게 됨

@Repository
@Query("SELECT * FROM xxx WHERE xxx")
@Transactional
@Modifying

 

@Repository

  • JPA에서의 DB Layer 접근자를 의미한다.
  • 인터페이스를 생성 후 JpaRepository<Entity 클래스, PK 타입>을 상속하면 기본적인 CRUD 메소드가 자동으로 생성된다.
  • @Repository를 추가할 필요가 없다.
  • JPA 처리를 담당하는 Repository는 기본적으로 4가지가 있다. (T : Entity의 타입클래스, ID : P.K 값의 Type)
    1. Repository<T, ID>
    2. CrudRepository<T, ID>
    3. PagingAndSortingRepository<T, ID>
    4. JpaRepository<T, ID>


@Query("SELECT * FROM xxx WHERE xxx")

  • 실행할 메서드 위에 정적 쿼리를 작성 한다.
  • JpaRepository 를 상속하는 인터페이스에서 사용한다.
  • Spring Data JPA에서는 기본적으로 JpaRepository를 통해서 제공되는 findById와 같은 메서드도 있고, 메서드 네이밍만을 통해서 쿼리를 실행할 수 있도록 기능을 제공해주고 있다. 하지만, 이 두가지 방법으로도 만들 수 없는 쿼리가 필요하다면, 쿼리를 직접 작성해야 한다. 그 때 커스텀 Reopository의 메서드에 붙이는 annotation이다. 기본적으로는 JPQL로 작성할 수 있고, nativeQuery=true 옵션으로 네이티브 쿼리도 사용 가능하다.


@Modifying

  • @Query Annotation으로 작성 된 변경, 삭제 쿼리 메서드를 사용할 때 필요함
  • 조회 쿼리를 제외하고, 데이터에 변경이 일어나는 INSERT, UPDATE, DELETE, DDL 에서 사용
  • 주로 벌크 연산 시에 사용됨(기본적으로 제공되는 쿼리 메서드나 메서드 네이밍으로 파생되는 쿼리 메서드에서는 적용이 되지 않음)
  • JPA Entity LifeCycle을 무시하고 쿼리가 실행되기 때문에 해당 annotation을 사용할 때는 영속성 콘텍스트 관리에 주의해야 함. => clearAutomatically, flushAutomatically를 통해 간단하게 해결할 수 있음
  • https://velog.io/@dnjscksdn98/JPA-Hibernate-Spring-Data-JPA-Modifying

 

'두두의 IT > Spring' 카테고리의 다른 글

개발 프로세스 (비즈니스 요구사항, 설계)  (0) 2022.10.13
Spring Boot Junit5  (0) 2022.06.23
Spring Boot Service Annotation  (0) 2022.05.23
Spring Boot Main Annotation  (0) 2022.05.23
Spring Boot Git Open Source  (0) 2022.05.20