Korea_sleep_Tech_springBoot/src/main/java/com/example/korea_sleepTech_springboot at main · seoyoonchoi/Korea_sleep_Tech_springB
Contribute to seoyoonchoi/Korea_sleep_Tech_springBoot development by creating an account on GitHub.
github.com
실제 코드를 더 확인하고 싶다면 위 링크를 통해서 확인할 수 있다. 이 글에서는 간략하게 코드의 중요한 부분만 발췌하였다.
Repository의 역할
Spring Boot의 Repository는 단순히 데이터를 가져오고 저장하는 계층이 아니다. 실제로는 도메인과 데이터베이스 사이의 추상화 계층 역할을 하며, 다음과 같은 철학 위에 설계되어 있다.
추상화된 데이터 접근 계층 (Abstraction of Data Access)
- JPA에서는 직접 EntityManager를 사용해 쿼리를 작성할 수 있지만, 반복되는 CRUD 로직을 줄이기 위해 Spring Data JPA가 등장함.
- Repository 인터페이스를 정의하고 JpaRepository나 CrudRepository를 확장하기만 하면, 기본적인 CRUD 기능은 자동 구현됨.
메서드 이름만으로 쿼리 생성 (Query Method)
- findByEmail, existsByEmail과 같은 메서드는 JPA가 메서드명을 분석해 자동으로 SQL을 생성해줌.
- 덕분에 비즈니스 로직에 집중할 수 있고, 쿼리를 일일이 작성하지 않아도 됨.
UserRepository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
boolean existsByEmail(String email);
Optional<User> findByEmail(String email);
}
기능
- existsByEmail: 회원가입 시 이메일 중복 여부 확인
- findByEmail: 로그인, 인증 관련 사용자 정보 조회
추가설명
- Optional<User>는 null 처리를 안전하게 하기 위한 Java 8의 기능으로, null을 반환하기보다는 Optional.empty()를 통해 예외 발생 가능성을 줄이고 명시적으로 처리하게 만듦.
- @Repository는 예외 변환기 역할을 함. 내부에서 발생하는 JPA 예외를 스프링의 DataAccessException으로 감싸서 던짐. 트랜잭션 추상화에도 관여됨.
RoleRepository
public interface RoleRepository extends JpaRepository<Role, Long> {
Optional<Role> findByRoleName(String roleName);
}
기능
- existsByEmail: 회원가입 시 이메일 중복 여부 확인
- findByEmail: 로그인, 인증 관련 사용자 정보 조회
이론적 배경
- Optional<User>는 null 처리를 안전하게 하기 위한 Java 8의 기능으로, null을 반환하기보다는 Optional.empty()를 통해 예외 발생 가능성을 줄이고 명시적으로 처리하게 만듦.
- @Repository는 예외 변환기 역할을 함. 내부에서 발생하는 JPA 예외를 스프링의 DataAccessException으로 감싸서 던짐. 트랜잭션 추상화에도 관여됨.
RoleChangeLogRepository
public interface RoleChangeLogRepository extends JpaRepository<RoleChangeLog, Long> {
}
기능
- 사용자 권한이 변경될 때의 로그를 저장하고 조회
- 아직 커스텀 메서드는 없지만, 기본 CRUD 기능으로 로그 저장/조회 가능
이론적 배경
- 변경 이력 저장은 이벤트 소싱(Event Sourcing), **감사(Audit)**의 기본적인 예
- 권한 변경은 보안성과 관련된 민감한 이슈이므로, 변경 내역을 남기는 것은 보안 감사 추적의 관점에서 매우 중요
Repository 계층의 원칙과 특징 정리
- Repository는 인터페이스다
- 내부적으로 Spring Data JPA가 프록시 객체를 생성해 실제 구현을 대신해줌
- @EnableJpaRepositories 또는 @SpringBootApplication에 포함된 자동 설정으로 작동
- 도메인 주도 설계(Domain-Driven Design)의 핵심 구성 요소
- Repository는 도메인 객체에 대한 영속성(Persistence) 추상화 계층으로서, 도메인 모델과 DB 접근 기술을 분리시켜줌
- 선언적 프로그래밍 방식
- 쿼리를 직접 구현하지 않아도 되므로, 코드의 가독성, 생산성, 유지보수성이 모두 향상됨
- 자동 쿼리 생성
- 이름 기반으로 쿼리를 자동 생성하며, 복잡한 조건은 @Query 혹은 QueryDSL, Specification 등으로 확장 가능
'웹개발 > SpringBoot' 카테고리의 다른 글
| 보안과 권한 시스템 - 4. Service/ServiceImpl (0) | 2025.06.05 |
|---|---|
| 보안과 권한 시스템 - 3. Controller (1) | 2025.06.04 |
| 보안 인증과 권한 시스템 - 1. Entity (1) | 2025.06.02 |
| Springboot로 게시판(Post&Comment)만들기 - 두 테이블 연결 (0) | 2025.06.01 |
| SpringBoot 검색기능+Enum활용 (0) | 2025.05.31 |