Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
a05dd56
Merge pull request #29 from 3-mnms/feature/MNMS-190
CECHERI Aug 26, 2025
7f2c1ac
MNMS-414 fix: address 기본 배송지 설정 수정
UN15 Aug 26, 2025
f7e9b38
merge
UN15 Aug 26, 2025
11d9f4d
MNMS-414 fix: dev properties 수정
UN15 Aug 26, 2025
f37f916
Merge pull request #30 from 3-mnms/feature/MNMS-414
UN15 Aug 26, 2025
9db896b
MNMS-414 feat: 회원 주소 정보 한 개 조회 기능 추가
UN15 Aug 26, 2025
bf9c546
Merge pull request #31 from 3-mnms/feature/MNMS-414
UN15 Aug 26, 2025
cb1e387
MNMS-414 fix: 잘못된 주민번호 입력 시 error 처리 추가
UN15 Aug 27, 2025
1016bb4
Merge pull request #32 from 3-mnms/feature/MNMS-414
UN15 Aug 27, 2025
883a011
MNMS-414 fix: 주소 request dto 문제 수정
UN15 Aug 27, 2025
9808056
Merge pull request #33 from 3-mnms/feature/MNMS-414
UN15 Aug 27, 2025
58affad
MNMS-414 fix: logs 폴더 설정 삭제
UN15 Aug 28, 2025
7221894
Merge pull request #34 from 3-mnms/feature/MNMS-414
UN15 Aug 28, 2025
05e5018
MNMS-414 fix: gitignore fix
UN15 Aug 28, 2025
e962454
Merge pull request #35 from 3-mnms/feature/MNMS-414
UN15 Aug 28, 2025
650d66c
refactor: dockerfile 수정
V4N1LLA Aug 28, 2025
05cd3f4
Merge branch 'develop' of https://github.com/3-mnms/user into develop
V4N1LLA Aug 28, 2025
760202a
Merge branch 'develop' of https://github.com/3-mnms/user into feature…
CECHERI Aug 28, 2025
d2b81f5
MNMS-414 feat: 사용자 나이 정보 확인 api 생성
UN15 Aug 29, 2025
a7b1393
Merge pull request #38 from 3-mnms/feature/MNMS-414
UN15 Aug 29, 2025
5eb0c0d
MNMS-414 fix: 양도 시 본인에게는 양도할 수 없도록 수정
UN15 Aug 29, 2025
cb6680b
Merge pull request #39 from 3-mnms/feature/MNMS-414
UN15 Aug 29, 2025
8e589ff
MNMS-190 bug: 알림 히스토리 전체 조회 DTO nid 추가
CECHERI Aug 29, 2025
169f819
Merge pull request #40 from 3-mnms/feature/MNMS-190
CECHERI Aug 29, 2025
35e83b1
MNMS-414 fix: 양수자 정보 조회 시 id값 추가
UN15 Sep 2, 2025
639151a
MNMS-414 feat: token 이름 깨짐 문제 수정
UN15 Sep 2, 2025
755e314
Merge pull request #41 from 3-mnms/feature/MNMS-414
UN15 Sep 2, 2025
1ec8346
MNMS-414 fix: userName null 문제 수정
UN15 Sep 2, 2025
7c8f666
Merge pull request #42 from 3-mnms/feature/MNMS-414
UN15 Sep 2, 2025
58202c1
MNMS-414 fix: update
UN15 Sep 2, 2025
a1e728a
Merge pull request #43 from 3-mnms/feature/MNMS-414
UN15 Sep 2, 2025
53b0acd
MNMS-190 Bug: fcm 토큰 USER만 발급되도록 변경
CECHERI Sep 3, 2025
750797c
MNMS-414 fix: BookingProfileDTO name 추가
UN15 Sep 3, 2025
9f91f51
Merge pull request #44 from 3-mnms/feature/MNMS-414
UN15 Sep 3, 2025
b812730
MNMS-190 Fix: 알림 발송될 때의 구성 변경
CECHERI Sep 3, 2025
4a94ae2
MNMS-190 Fix: 알림 수정
CECHERI Sep 4, 2025
534d022
Merge branch 'develop' of https://github.com/3-mnms/user into feature…
CECHERI Sep 4, 2025
2ecd1c9
Merge pull request #45 from 3-mnms/feature/MNMS-190
CECHERI Sep 4, 2025
8a90f3a
MNMS-584 feat: user address geocode 기능 추가
UN15 Sep 4, 2025
a2a85b5
MNMS-584 feat: user geocodeInfo 정보 조회 기능 추가
UN15 Sep 4, 2025
bd94428
MNMS-524 Fix: fcm 알림 중복 발송 notification -> data 방식으로 바꿔 해결
CECHERI Sep 5, 2025
7e3f4a2
feat: prometheus, grafana 의존성 추가
V4N1LLA Sep 5, 2025
e4f94e1
feat: prometheus 의존성 추가
V4N1LLA Sep 5, 2025
323ab3a
MNMS-584 fix: geocode 관련 컬럼 address로 변경
UN15 Sep 5, 2025
b723811
feat: tomcat 및 빠진 의존성 추가
V4N1LLA Sep 5, 2025
0f75539
feat: tomcat 및 빠진 의존성 추가
V4N1LLA Sep 5, 2025
8d00327
MNMS-584 fix: 주소 수정 시 다시 geocode 되도록 수정
UN15 Sep 5, 2025
2071df3
Merge branch 'develop' into feature/MNMS-584
UN15 Sep 5, 2025
9d98f65
Merge pull request #46 from 3-mnms/feature/MNMS-584
UN15 Sep 5, 2025
682bb51
MNMS-584 fix: properties 수정
UN15 Sep 6, 2025
b2ed5eb
MNMS-584 fix: geocode pending 시 geocode 호출로 수정
UN15 Sep 6, 2025
0e789a9
Merge pull request #47 from 3-mnms/feature/MNMS-584
UN15 Sep 6, 2025
6ed91f9
MNMS-617 fix: user dev properties 원복
UN15 Sep 4, 2025
9e3fd84
MNMS-584 fix: 주소 update 설정 시 geocode 되도록 수정
UN15 Sep 9, 2025
27714e2
Merge branch 'develop' of https://github.com/3-mnms/user into feature…
UN15 Sep 9, 2025
e062229
Merge pull request #48 from 3-mnms/feature/MNMS-584
UN15 Sep 9, 2025
5a6a038
MNMS-655 feat: swagger 추가
UN15 Sep 11, 2025
7bbab2b
Merge pull request #49 from 3-mnms/feature/MNMS-655
UN15 Sep 11, 2025
ccdd5eb
Bug: 회원탈퇴 오류 수정
CECHERI Sep 11, 2025
019daf4
MNMS-655 rename: swagger 파일 경로 변경
UN15 Sep 12, 2025
c672d4e
Merge pull request #50 from 3-mnms/feature/MNMS-655
UN15 Sep 12, 2025
d226367
MNMS-665 fix: 주소 오류 수정
UN15 Sep 12, 2025
96bb69e
Merge pull request #51 from 3-mnms/feature/MNMS-665
UN15 Sep 12, 2025
2a578d6
MNMS-668 Bug: booking에서 불러오는 외부 api base url 하드코딩 된 부분 수정
CECHERI Sep 12, 2025
071651d
MNMS-668 Bug: booking에서 불러오는 외부 api base url 하드코딩 된 부분 수정2
CECHERI Sep 12, 2025
27b1e38
MNMS-665 fix: 회원가입 시 주소 오류 수정
UN15 Sep 12, 2025
d23522c
Merge pull request #52 from 3-mnms/feature/MNMS-665
UN15 Sep 12, 2025
55c93e5
MNMS-672 feat: 중복 로그인 막기 기능 일부 추가
UN15 Sep 13, 2025
0270062
MNMS-672 feat: 중복 로그인 처리 기능 추가
UN15 Sep 14, 2025
9ee3b4f
MNMS-672 fix: authcontroller swagger 수정
UN15 Sep 14, 2025
e42e936
MNMS-672 fix: token 값 version, sessionId 안 넣도록 수정
UN15 Sep 14, 2025
09ad4f3
MNMS-672 fix: 정지 상태 오류 메시지 문제 수정
UN15 Sep 15, 2025
f471a0b
MNMS-672 fix: 중복 로그인 막기 기능 확인 완료(1차)
UN15 Sep 15, 2025
613e3ca
MNMS-679 Bug: 공연 별 예매자 성별/나이 통계 조회 안되는 오류 + 관리자는 공지 삭제 안되던 오류 수정
CECHERI Sep 15, 2025
60bd815
Merge pull request #53 from 3-mnms/feature/MNMS-679
CECHERI Sep 15, 2025
b48df4e
MNMS-679 Bug: notice : notification -> data
CECHERI Sep 15, 2025
51a4f67
Merge branch 'develop' of https://github.com/3-mnms/user into feature…
UN15 Sep 16, 2025
d27c403
Merge pull request #54 from 3-mnms/feature/MNMS-672
UN15 Sep 16, 2025
7615c61
Merge branch 'develop' of https://github.com/3-mnms/user into feature…
UN15 Sep 16, 2025
eee96e2
MNMS-672 feat: runner 추가
UN15 Sep 16, 2025
a6c8703
Merge pull request #55 from 3-mnms/feature/MNMS-672
UN15 Sep 16, 2025
a0ff777
MNMS-679 Fix: 모바일 알림 안가는 거 수정 테스트..
CECHERI Sep 16, 2025
b066ceb
MNMS-650 Fix: 모바일 알림 테스트 수정
CECHERI Sep 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,8 @@ src/main/resources/application-secret.properties
src/main/resources/application-prod.properties
*.secret.properties

keys
keys/**

src/main/resources/keys/private.pem
**/private.pem

gateway-config
init

src/main/resources/firebase/firebase-adminsdk.json
docker-compose.yml
52 changes: 43 additions & 9 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,20 +1,54 @@
# Debian/Ubuntu 계열 JRE (amd64/arm64 모두 제공)
FROM eclipse-temurin:17-jre-jammy
############################
# 1) Build stage (JDK)
############################
FROM eclipse-temurin:17-jdk-jammy AS build
WORKDIR /workspace

# spring 사용자/그룹 생성 (Debian 표준 명령)
# Gradle wrapper & 설정 먼저 복사(캐시 잘 쓰기 위함)
COPY gradlew gradle/ /workspace/
COPY build.gradle* settings.gradle* /workspace/
RUN chmod +x gradlew

# 의존성 워밍업 (빌드캐시)
RUN --mount=type=cache,target=/root/.gradle \
./gradlew --no-daemon help || true

# 나머지 소스 복사 후 빌드
COPY . /workspace
RUN --mount=type=cache,target=/root/.gradle \
./gradlew --no-daemon clean bootJar -x test

# 산출물 꺼내두기
RUN JAR="$(ls build/libs/*.jar | head -n1)" && \
install -D "$JAR" /out/app.jar

# ✅ 가드: user 레포의 메인 클래스가 JAR에 반드시 존재해야 함
ARG MAIN_CLASS_PATH=com/tekcit/festival/FestivalServiceApplication.class
RUN jar tf /out/app.jar | grep -q "$MAIN_CLASS_PATH" \
|| (echo "ERROR: missing $MAIN_CLASS_PATH in built JAR; check project structure" >&2; exit 1)


############################
# 2) Runtime stage (JRE)
############################
FROM eclipse-temurin:17-jre-jammy AS runtime

# 비루트 사용자 생성
RUN groupadd -r spring \
&& useradd -r -g spring -d /home/spring -s /usr/sbin/nologin spring \
&& mkdir -p /app /home/spring
&& mkdir -p /app /home/spring /etc/keys /etc/firebase \
&& chown -R spring:spring /app /home/spring /etc/keys /etc/firebase

WORKDIR /app

# 빌드 산출물 복사 (권한도 함께 설정)
ARG JAR_FILE=build/libs/*.jar
COPY --chown=spring:spring ${JAR_FILE} /app/app.jar
# 빌드 산출물 복사
COPY --from=build --chown=spring:spring /out/app.jar /app/app.jar

# 비루트 실행
USER spring

EXPOSE 8080

# 컨테이너 메모리 친화 옵션
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75"

# 실행
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop' // Slf4j 로그용 추가
implementation 'org.springframework.boot:spring-boot-starter-webflux'

// prometheus
implementation 'io.micrometer:micrometer-registry-prometheus'

// MariaDB
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

import java.util.UUID;

@SpringBootApplication
@Slf4j
@EnableJpaAuditing
@EnableScheduling
public class FestivalServiceApplication {

public static void main(String[] args) {
SpringApplication.run(FestivalServiceApplication.class, args);
}

}
16 changes: 16 additions & 0 deletions src/main/java/com/tekcit/festival/config/security/AuthDetails.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.tekcit.festival.config.security;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.web.authentication.WebAuthenticationDetails;

public class AuthDetails extends WebAuthenticationDetails {
private final String userName;

public AuthDetails(HttpServletRequest request, String userName) {
super(request);
this.userName = userName;
}
public String getUserName() {
return userName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,19 @@
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

// --- HeaderAuthenticationFilter를 SecurityConfig 내부에 정의하여 관리합니다. ---
Expand All @@ -55,7 +38,14 @@ protected void doFilterInternal(

final String userIdHeader = trimToNull(request.getHeader("X-User-Id"));
final String rolesHdr = trimToNull(request.getHeader("X-User-Role"));

final String userNameHeader = trimToNull(request.getHeader("X-User-Name"));
String userName = "";
if(userNameHeader != null) {
userName = new String(
java.util.Base64.getUrlDecoder().decode(userNameHeader),
java.nio.charset.StandardCharsets.UTF_8
);
}
Authentication current = SecurityContextHolder.getContext().getAuthentication();
boolean isAnonymous = (current instanceof AnonymousAuthenticationToken);
boolean canSetAuth = (current == null) || isAnonymous;
Expand Down Expand Up @@ -83,7 +73,7 @@ protected void doFilterInternal(

UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(String.valueOf(userId), null, authorities);
auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
auth.setDetails(new AuthDetails(request, userName));
SecurityContextHolder.getContext().setAuthentication(auth);

// principal을 **Long**으로 세팅
Expand All @@ -107,6 +97,9 @@ private static String trimToNull(String s) {
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();
String method = request.getMethod();
return "OPTIONS".equals(method) || path.startsWith("/actuator");

return "OPTIONS".equals(method)
|| path.startsWith("/actuator")
|| path.startsWith("/api/users/statisticsList");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,15 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.logout(logout -> logout.disable())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health/**", "/actuator/prometheus").permitAll()
.requestMatchers(
"/api/users/signupUser",
"/api/users/signupAdmin",
"/api/users/findLoginId",
"/api/users/findRegisteredEmail",
"/api/users/resetPasswordEmail",
"/api/users/login",
"/api/users/login/confirm",
"/api/auth/kakao/signupUser"
).anonymous()
.requestMatchers(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
package com.tekcit.festival.config.security;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;

@Configuration
public class WebClientConfig {

@Value("${booking.base.service.url}")
private String bookingBaseServiceUrl;

@Bean
public WebClient bookingWebClient() {
return WebClient.builder()
.baseUrl("http://localhost:8082")
.baseUrl(bookingBaseServiceUrl)
.build();
}

// 다른 외부 서비스 호출을 할 수 있음
// @Bean
// public WebClient anotherWebClient() {
// return WebClient.builder()
// .baseUrl("http://another-service-url")
// .build();
// }
}

This file was deleted.

Loading