Skip to content

[SERVER] INU + Dormitory 교내 기숙사의 모든 것, 앱 서비스

License

Notifications You must be signed in to change notification settings

idorm/idorm-server

Repository files navigation

아이돔

인천대학교 기숙사생들을 위한 모든 것 • 백엔드 레포지토리


크롤링 기반 기숙사 공식 일정 알림    |     룸메이트와 공유 캘린더    |     룸메이트 매칭    |     기숙사 커뮤니티


서비스 UI


개발 과정

나현 : 유지보수성 향상을 위한 헥사고날 아키텍처 도입기

나현 : 인터셉터와 Argument Resolver를 이용한 컨트롤러 내 중복 코드 개선기

나현 : JPA N+1 문제를 찾기 위한 쿼리 카운터 개발기

나현 : XToOne 조회 시 N+1 문제에 대한 쿼리 튜닝과 페이징 최적화

나현 : 프록시 방식의 AOP 한계 - self invocation 이슈

나현 : @Async를 이용한 이메일 인증 기능 비동기 처리와 주의 사항

송현 : 성능과 동시성을 고려한 게시글 좋아요 개수 최적화하기

송현 : 커버링 인덱스를 활용하여 풀 스캔과 파일 정렬 개선하기

송현 : 인터페이스를 활용하여 에러코드 및 성공 코드 도메인 별로 분리하기

송현 : 게시글 조회 쿼리 N+1 문제 해결하기


Project Structure

헥사고날 아키텍처를 적용하였습니다.
컴포넌트 별 명확하게 관심사를 분리하고, 추상화 기반 설계를 강화함으로써 컴포넌트 별 의존성을 줄였습니다.

.
├── IdormServerApplication.java
├── auth
├── calendar
│   ├── officialCalendar
│   ├── teamCalendar
│   ├── sleepOverCalendar
│   └── team
├── common
│   ├── config
│   │   ├── AsyncConfig.java
│   │   ├── FirebaseConfig.java
│   │   ├── JpaAuditingConfig.java
│   │   ├── MailConfig.java
│   │   ├── S3Config.java
│   │   ├── SchedulingConfig.java
│   │   ├── SwaggerConfig.java
│   │   ├── TimeConfig.java
│   │   ├── WebMvcConfig.java
│   │   ├── WebMvcLocalConfig.java
│   │   └── WebSecurityConfig.java
│   ├── entity
│   │   └── BaseTimeEntity.java
│   ├── exception
│   │   ├── BaseException.java
│   │   ├── BaseResponseCode.java
│   │   ├── GlobalExceptionHandler.java
│   │   └── GlobalResponseCode.java
│   ├── logging
│   │   ├── ErrorLoggingAdvice.java
│   │   ├── ExecutionTimer.java
│   │   └── LoggingAdvice.java
│   ├── performance
│   │   ├── JpaInspector.java
│   │   ├── NPlusOneWarning.java
│   │   ├── QueryCountInterceptor.java
│   │   └── QueryCounter.java
│   ├── response
│   │   ├── ErrorResponse.java
│   │   └── SuccessResponse.java
│   └── util
│       └── Validator.java
├── community
│   ├── post
│   ├── postLike
│   ├── postPhoto
│   └── comment
├── email
│   ├── adapter
│   │   ├── in
│   │   │   └── web
│   │   │       └── EmailController.java
│   │   └── out
│   │       ├── EmailResponseCode.java
│   │       ├── api
│   │       │   ├── GoogleMailClient.java
│   │       │   └── MockMailClient.java
│   │       ├── exception
│   │       │   ├── DuplicatedEmailException.java
│   │       │   ├── EmailServerErrorException.java
│   │       │   ├── ExpiredEmailVerificationCodeException.java
│   │       │   ├── InvalidEmailCharacterException.java
│   │       │   ├── InvalidVerificationCode.java
│   │       │   └── NotFoundEmailException.java
│   │       └── persistence
│   │           ├── DeleteEmailAdapter.java
│   │           ├── EmailRepository.java
│   │           ├── LoadEmailAdapter.java
│   │           └── SaveEmailAdapter.java
│   ├── application
│   │   ├── EmailService.java
│   │   ├── RandomVerificationCodeGenerator.java
│   │   └── port
│   │       ├── in
│   │       │   ├── EmailUseCase.java
│   │       │   └── dto
│   │       │       ├── EmailSendRequest.java
│   │       │       └── EmailVerifyRequest.java
│   │       └── out
│   │           ├── DeleteEmailPort.java
│   │           ├── GenerateVerificationCodePort.java
│   │           ├── LoadEmailPort.java
│   │           ├── SaveEmailPort.java
│   │           └── SendEmailPort.java
│   └── entity
│       ├── Email.java
│       └── EmailStatus.java
├── matchingInfo
├── matchingMate
├── member
├── notification
├── photo
└── report