DDIP 프로젝트의 백엔드로 참여하게 되었다. DDIP 프로젝트는 일상의 순간을 돈으로 바꾸기 위한 서비스를 만들기 위해 구성된 경북대학교 컴퓨터학부 학우들의 프로젝트이다.
백엔드로 참여하기 전, NEWZET 프로젝트에서 구성하였던 Auth 로직의 활용을 위해 인증/인가 파트를 도맡아 최초 서비스를 구성하기로 하였고 좀 더 안정성있고 확장 가능한 코드를 구성을 위한 여러 시도들을 해보았다!
기존 NEWZET 프로젝트에서 구현했던 객체지향적 JWT 인증 처리와 확장 가능한 OAuth 구조를 베이스로, 더욱 발전된 헥사고날 아키텍처를 도입했습니다. PostgreSQL에서 MySQL로의 마이그레이션, DeviceType 재정의, API 인터페이스 분리 등을 통해 이전 프로젝트의 한계점들을 보완한 백엔드 시스템으로 진화시켰다.
뉴젯의 작업물
[NEWZET - AUTH 1탄] 객체지향적 JWT 인증 처리 및 커스텀 리졸버/인터셉터 도입
[NEWZET - AUTH 2탄] 확장 가능한 객체지향적 OAuth 구조 설계 및 카카오 소셜 로그인 구현
기존 NEWZET 프로젝트 대비 주요 개선사항
변경사항: Web/App → TABLET/PHONE
기존: 플랫폼 기반 구분 (웹/앱)
개선: 디바이스 형태 기반 구분 (태블릿/폰)
이유: 반응형 웹 시대에 맞는 더 명확한 사용자 경험 구분
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/ - 인증/인가 처리
// 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;
해결된 이슈:
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 {
// 순수한 비즈니스 로직만 집중
}
Test: MySQL의 테스트 컨테이너를 primary로 테스트 환경에서 설정
Test: Redis의 테스트 컨테이너를 primary로 테스트 환경에서 설정
Test: gitignore된 환경변수들을 테스트환경에서 임의의 값으로 사용할 수 있도록 구성
주요 항목:

마지막 X들은 비밀...