[DDIP] 헥사고날 아키텍쳐 기반 Auth 및 OAuth 로직 구현 (NEWZET 경험 기반 고도화)

dodo·2025년 8월 1일

DDIP

목록 보기
1/3
post-thumbnail

DDIP 프로젝트의 백엔드로 참여하게 되었다. DDIP 프로젝트는 일상의 순간을 돈으로 바꾸기 위한 서비스를 만들기 위해 구성된 경북대학교 컴퓨터학부 학우들의 프로젝트이다.

백엔드로 참여하기 전, NEWZET 프로젝트에서 구성하였던 Auth 로직의 활용을 위해 인증/인가 파트를 도맡아 최초 서비스를 구성하기로 하였고 좀 더 안정성있고 확장 가능한 코드를 구성을 위한 여러 시도들을 해보았다!

배경

기존 NEWZET 프로젝트에서 구현했던 객체지향적 JWT 인증 처리와 확장 가능한 OAuth 구조를 베이스로, 더욱 발전된 헥사고날 아키텍처를 도입했습니다. PostgreSQL에서 MySQL로의 마이그레이션, DeviceType 재정의, API 인터페이스 분리 등을 통해 이전 프로젝트의 한계점들을 보완한 백엔드 시스템으로 진화시켰다.

뉴젯의 작업물
[NEWZET - AUTH 1탄] 객체지향적 JWT 인증 처리 및 커스텀 리졸버/인터셉터 도입
[NEWZET - AUTH 2탄] 확장 가능한 객체지향적 OAuth 구조 설계 및 카카오 소셜 로그인 구현

작업 내용

기존 NEWZET 프로젝트 대비 주요 개선사항

1. DeviceType 전략적 재설계

변경사항: Web/App → TABLET/PHONE
기존: 플랫폼 기반 구분 (웹/앱)
개선: 디바이스 형태 기반 구분 (태블릿/폰)
이유: 반응형 웹 시대에 맞는 더 명확한 사용자 경험 구분

2. 헥사고날 아키텍쳐 패턴 고도화 구현

DDIP 아키텍처 구조
├── business
│   ├── service/ - 비즈니스 로직 오케스트레이션
│   ├── port/in/ - 인바운드 포트 (Controller가 호출)
│   └── port/out/ - 아웃바운드 포트 (Repository 추상화)
├── domain (순수 비즈니스 로직)
│   ├── 도메인 엔티티 (User, Token, OAuthMapping)
│   ├── 값 객체 (DeviceType, OAuthProvider)
│   └── 도메인 인터페이스
├── Infrastructure
│   ├── JPA Repository 구현체
│   ├── external/ - 외부 API (카카오, Redis)
│   └── entity/ - JPA 엔티티
└── presentation
    ├── controller/ - HTTP 요청 처리
    ├── api/ - API 명세 인터페이스 (Swagger 분리)
    └── interceptor/ - 인증/인가 처리

3. MySQL 마이그레이션 및 UUID 최적화

// PostgreSQL (기존)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

// MySQL (개선)
@Id
@UuidGenerator
@Column(columnDefinition = "char(36)", updatable = false, nullable = false)
@JdbcTypeCode(SqlTypes.CHAR)
private UUID id;

해결된 이슈:

  • UUID 타입 호환성 문제 해결
  • char(36) 타입으로 인덱스 성능 최적화
  • MySQL 8.0 호환성 보장

4. API 설계 Interface Segregation 패턴 도입

Feat: OAuth관련 엔드포인트 swagger 설정을 위한 인터페이스 구성

Feat: User용 presentation 단에서 사용할 swagger및 rest 설정 인터페이스 구성

// 기존: Controller에 Swagger 어노테이션 직접 추가 (관심사 혼재)
@RestController
@Tag(name = "유저")
public class UserController {
    @PostMapping("/signup")
    @Operation(summary = "회원가입")
    public ResponseEntity<JwtResponse> signup() { ... }
}

// 개선: API 명세와 구현체 완전 분리
@Tag(name = "유저", description = "유저 관련 API")
@RequestMapping("/api")
public interface UserApi {
    @Operation(summary = "회원 가입", description = "OAuth 후 회원가입 진행")
    ResponseEntity<JwtResponse> signup(@Valid @RequestBody SignupRequest request);
}

@RestController
@RequiredArgsConstructor
public class UserController implements UserApi {
    // 순수한 비즈니스 로직만 집중
}

5. 테스트 인프라 개선

Test: Redis 테스트 컨테이너 설정

Test: MySQL의 테스트 컨테이너를 primary로 테스트 환경에서 설정

Test: Redis의 테스트 컨테이너를 primary로 테스트 환경에서 설정

Test: gitignore된 환경변수들을 테스트환경에서 임의의 값으로 사용할 수 있도록 구성

주요 항목:

  • TEST 하위 config에 MySQL, Redis 관련 컨테이너 구성
    -> 실제 DB를 사용하지 않고 통일된 환경에서 테스트 가능
  • primary bean 설정으로 테스트 환경에서만 작동하도록 구현
  • CI 환경에서의 env 제거

마지막 X들은 비밀...

PR : https://github.com/dev-DDIP/ddip-BE/pull/17

profile
클라우드 데이터 플랫폼 주니어 개발자 도도입니다!

0개의 댓글