![[인프런 워밍업 클럽 3기 / 백엔드 프로젝트] 2주차 정리](https://cdn.inflearn.com/public/files/blogs/de533896-c027-4319-87e9-bb3ae0484063/인프런스터디 썸네일.png)
[인프런 워밍업 클럽 3기 / 백엔드 프로젝트] 2주차 정리
해당글은 [입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기: 정보근]
강의를 보고 공부한 내용입니다.
2주차 부터는 실습 위주의 강의로 공부 내용의 경우 어노테이션 중심으로 정리했습니다.
공부 내용 정리
1. 도메인 레이어
도메인 레이어 설명
Entity: 데이터베이스 테이블과 매핑되는 클래스.
Repository: JPA를 활용하여 엔티티와 데이터베이스 간의 CRUD 작업을 수행하는 인터페이스.
관련 어노테이션
@Entity // JPA 엔티티 클래스 지정.
@Id // 기본 키(PK) 지정.
@GeneratedValue // PK 자동 생성 전략 설정.
@Column // 데이터베이스 컬럼과 매핑.
@CreatedDate // 엔티티 생성 날짜 자동 저장.
@OneToMany // 1:N 관계 설정.
@ManyToOne // N:1 관계 설정.
@JoinColumn //외래 키 지정.
@OneToOne //1:1 관계 설정.
@ManyToMany // N:M 관계 설정.
Spring Data JPA - JpaRepository 설명
JpaRepository는 Spring Data JPA에서 제공하는 인터페이스로, 기본적인 CRUD 메서드를 제공합니다.
public interface UserRepository extends JpaRepository<User, Long> {}
기본 CRUD 메서드
save(entity) // 엔티티 저장 또는 수정
findById(id) // ID(PK)로 조회
existsById(id) // 존재 여부 확인
delete(entity) // 엔티티 삭제
deleteById(id) // ID(PK)로 삭제
findAll() // 모든 데이터 조회
count() // 전체 데이터 개수 조회
메서드 네이밍 규칙
도메인에 종속되는 기능이라도 메소드명 네이밍 규칙을 따르면 그에 맞는 쿼리를 자동으로 생성해주기도 합니다. 따라서 기본적인 명명 규칙을 찾아 정리해보았습니다.
findBy + 필드명 : 특정 필드로 조회
findBy + 필드명 + And/Or + 필드명 : 복합 조건 조회
findBy + 필드명 + GreaterThan/LessThan : 비교 연산
findBy + 필드명 + Containing/StartsWith/EndsWith : Like 검색
findBy + 필드명 + IsNull/IsNotNul : NULL 처리
findBy + 필드명 + OrderBy + 필드명 + Asc/Desc : 정렬
findTopNBy + 필드명 : 상위 N개 조회
2. 프레젠테이션 레이어
프레젠테이션 레이어 설명
프레젠테이션 레이어는 HTTP 요청을 받아 서비스 계층과 상호작용하며, 클라이언트에 응답을 반환하는 역할을 수행합니다. 컨트롤러, DTO, 서비스, 인터셉터로 구성됩니다.
Controller: HTTP 요청을 처리하는 역할.
DTO: 데이터 전달을 위한 객체.
Service: 비즈니스 로직을 처리하는 계층.
Interceptor: 컨트롤러에 도달하기 전후에 요청을 가로채는 역할.
관련 어노테이션 정리
@Controller // Spring MVC 컨트롤러 역할. 뷰를 반환.
@RestController // @Controller + @ResponseBody 조합. JSON 반환.
@RequestMapping // 특정 URL과 컨트롤러 메서드 매핑.
@GetMapping // GET 요청 처리.
@PostMapping // POST 요청 처리.
@Service // 비즈니스 로직을 담당하는 서비스 클래스에 붙임.
@Repository // 데이터베이스와 연동되는 DAO 클래스에 붙임.
@Component // Spring Bean으로 등록하는 가장 기본적인 어노테이션.
@Transactional // 트랜잭션 관리. DB 작업 중 실패 시 롤백.
@Configuration // Spring 설정 클래스에 붙임.
4. 테스트 코드
테스트 코드의 작성은 기능을 개발하는 것만큼 중요한 작업입니다.
코드의 정확성, 유지보수성, 신뢰성을 보장하며, 개발 속도를 높이는 데에도 중요한 역할을 합니다.
단위 테스트 vs 통합 테스트 비교
단위 테스트 (Unit Test) : 개별 메서드, 클래스의 기능 검증. Mock 객체 사용. 실행 속도 빠름.
통합 테스트 (Integration Test) : 여러 계층(Controller → Service → Repository)의 연계를 테스트. 실제 DB 사용. 실행 속도 느림.
테스트 관련 어노테이션 정리
@ExtendWith // JUnit5와 스프링 테스트 환경 통합.
@InjectMocks // @Mock 객체를 테스트 대상 클래스에 주입.
@Mock // 테스트에서 Mock 객체 생성.
@SpringBootTest // Spring Boot 애플리케이션 컨텍스트 로드 후 테스트 실행.
@AutoConfigureMockMvc // MockMvc 자동 설정.
@DisplayName // 테스트 실행 시 표시될 이름 지정.
미션
미션3 - REST API 설계하기
API 명세서 작성 도구 선택
API 명세서 작성 도구로 어떤 도구를 선택해야할지 미션 전 고민이 많았습니다.
클라이언트 개발을 했을떈 보통 백엔드 팀원 분들이 스웨거 문서로 프로젝트 진행 시 사용을 했었는데 현재 Swagger에 대한 학습이 부족한 상태였기에 다른 방법을 찾아보았습니다.
대안 도구 = 포스트맨 문서 활용
포스트맨에서도 문서를 작성할 수 있고, 해당 내용을 공유할 수있음을 알게되었고 스웨거 적용 전 포스트맨 문서를 활용하기로 결정하였습니다.
200 외 오류 응답코드
userId 혹은 capsuleId를 찾을 수 없는 경우와 접근 권한(ROLE) 이 허용되지 않는 경우에 따라 다른 처리를 해야하기에 해당 케이스들을 명확하게 구분해야 했습니다.
특히, 프로젝트에서 작성자(OWNER) 와 참여자(MEMBER) 역할(Role)이 존재하기 때문에, 권한(Role) 기반 오류 처리 규칙을 정해야 했습니다.
오류 코드 정리
400 Bad Request : 잘못된 요청 -> userId 또는 capsuleId가 유효한 형식이 아닐 경우
401 Unauthorized : 인증 실패 -> 로그인하지 않은 사용자가 보호된 API에 접근 시 (JWT Token 사용 시 주로 사용)
403 Forbidden : 권한 없음 (인가 실패) -> 사용자는 존재하지만, role 에 따른 권한이 없어 접근 불가한 경우
404 Not Found : 리소스 없음 -> 요청한 리소스가 존재하지 않는 경우
코드 적용 규칙
1. 권한(Role)에 따라 접근이 제한되는 경우 → 403 Forbidden
- 예) 참여자(MEMBER)가 캡슐을 삭제하려고 하는 경우
→ 삭제 기능은 OWNER만 가능하므로, 권한 부족 → 403 응답 반환
1. 요청 데이터가 정상적으로 전달되었지만, 해당 리소스가 존재하지 않는 경우 → 404 Not Found
- 예) 존재하지 않는 userId로 게시글 조회 시
→ 해당 리소스가 없으므로 404 반환
회고
GOOD
단순히 아키텍쳐에 대한 이론만 들었을 때는 이해가 부족한 느낌이였는데 실습을 통해 뼈대를 잡으면서 점차 이해를 높일 수 있었습니다.
PROBLEM
처음 진행해보는 스프링 프로젝트기에 수많은 어노테이션들의 각 기능에 대해 개념이 섞이는 느낌이라 아직은 낯설게 느껴져 강의 자료를 참고하지않고 혼자서 작성하기에는 아직은 무리였습니다.
처음 h2 확인 실습 시 콘솔에 접속되지 않는 문제가 있었는데 코드 레벨에서의 문제는 없어 꽤 많은 시간을 해결하는데 할애하였습니다. 단순히 인텔리제이 Build설정을 Intellij IDEA -> Gradle로 설정하니 해결되었습니다.
성능 개선 부분에서 조금 이해가 어려웠습니다.
TRY
성능 개선 방법에 대해 개인적으로 더 공부해보고 고민해보기
댓글을 작성해보세요.