108 lines
3.1 KiB
Markdown
108 lines
3.1 KiB
Markdown
# Bio Backend
|
|
|
|
## 기술 스택
|
|
|
|
- **Framework**: Spring Boot
|
|
- **Database**: PostgreSQL
|
|
- **ORM**: Spring Data JPA + QueryDSL
|
|
- **Security**: Spring Security + JWT
|
|
- **Build Tool**: Gradle
|
|
- **Container**: Docker + Kubernetes
|
|
- **API Documentation**: Swagger (SpringDoc OpenAPI)
|
|
|
|
## 개발 가이드
|
|
|
|
### 1. 프로젝트 구조
|
|
|
|
```
|
|
src/main/java/com/bio/bio_backend/
|
|
├── domain/ # 도메인별 패키지
|
|
│ └── user/
|
|
│ └── member/ # 회원 도메인
|
|
│ ├── controller/ # API 엔드포인트
|
|
│ ├── service/ # 비즈니스 로직
|
|
│ ├── repository/ # 데이터 접근
|
|
│ ├── entity/ # JPA 엔티티
|
|
│ └── dto/ # 데이터 전송 객체
|
|
├── global/ # 공통 설정
|
|
│ ├── config/ # 설정 클래스
|
|
│ ├── security/ # 보안 설정
|
|
│ ├── exception/ # 예외 처리
|
|
│ └── utils/ # 유틸리티
|
|
└── BioBackendApplication.java
|
|
```
|
|
|
|
### 2. API 문서화 (Swagger)
|
|
|
|
#### Swagger UI 접속
|
|
|
|
- **URL**: `http://localhost:8080/service/swagger-ui.html`
|
|
- **API Docs**: `http://localhost:8080/service/api-docs`
|
|
|
|
#### 주요 어노테이션
|
|
|
|
```java
|
|
@Tag(name = "Member", description = "회원 관리 API")
|
|
@Operation(summary = "회원 가입", description = "새로운 회원을 등록합니다.")
|
|
@ApiResponses(value = {
|
|
@ApiResponse(responseCode = "201", description = "회원 가입 성공"),
|
|
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터")
|
|
})
|
|
```
|
|
|
|
#### 설정 파일
|
|
|
|
- **SwaggerConfig.java**: OpenAPI 기본 정보 설정
|
|
- **application.properties**: Swagger UI 커스터마이징
|
|
|
|
### 3. 트랜잭션 관리
|
|
|
|
#### 기본 설정
|
|
|
|
```java
|
|
@Service
|
|
@Transactional(readOnly = true) // 클래스 레벨: 읽기 전용 기본값
|
|
public class MemberServiceImpl {
|
|
|
|
// 읽기 전용 메서드 (별도 어노테이션 불필요)
|
|
public MemberDto selectMember(long seq) { ... }
|
|
|
|
// 쓰기 작업 메서드 (개별 @Transactional 적용)
|
|
@Transactional
|
|
public MemberDto createMember(MemberDto dto) { ... }
|
|
}
|
|
```
|
|
|
|
#### 핵심 규칙
|
|
|
|
- **클래스 레벨**: `@Transactional(readOnly = true)` 기본 설정
|
|
- **메서드별**: 데이터 수정 시에만 `@Transactional` 개별 적용
|
|
- **설정**: `spring.jpa.open-in-view=false` (성능 최적화)
|
|
|
|
### 4. 오류 등록 및 사용
|
|
|
|
#### 오류 코드 등록
|
|
|
|
```java
|
|
// ApiResponseCode.java
|
|
public enum ApiResponseCode {
|
|
USER_ID_DUPLICATE("400", "이미 존재하는 사용자 ID입니다."),
|
|
}
|
|
```
|
|
|
|
#### 오류 사용 방법
|
|
|
|
```java
|
|
// Service에서 예외 발생
|
|
throw new ApiException(ApiResponseCode.USER_ID_DUPLICATE);
|
|
|
|
// Controller에서 예외 처리 (자동)
|
|
// GlobalExceptionHandler가 ApiException을 잡아서 응답 변환
|
|
```
|
|
|
|
#### 핵심 규칙
|
|
|
|
- **오류 코드**: `ApiResponseCode` enum에 모든 오류 정의
|
|
- **예외 클래스**: `ApiException`으로 비즈니스 로직 예외 처리
|
|
- **자동 처리**: `GlobalExceptionHandler`가 일관된 응답 형태로 변환
|