Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
53dfc98
SecurityConfig, build.gradle local 수정사항 커밋
scholar-star May 11, 2026
88156e0
SecurityConfig, build.gradle local 수정사항 커밋
scholar-star May 11, 2026
9f23244
Merge branch 'main' of https://github.com/ApptiveDev/OnMyWay
scholar-star May 11, 2026
cf399ff
test와 운영 사이트에 적용할 DB 분리, 이로 인해 POSTGRESQL_URL를 환경 변수로 변경
scholar-star May 13, 2026
5a97fe5
테스트 환경 분리, 이로 인한 API 키와 baseURL 조정
scholar-star May 16, 2026
3c61dc9
도커 빌드용 Dockerfile과 관련한 ignore 공유
scholar-star May 17, 2026
0968a3a
테스트용 사이트 포트번호 변경
scholar-star May 17, 2026
f87e291
CI/CD 자동화를 위한 Github Actions .yml 파일 작
scholar-star May 17, 2026
70fc8a6
docker 실행 권한 sudo로 부여
scholar-star May 17, 2026
8c6b1ab
요일 매칭 숫자 교정
scholar-star May 17, 2026
d86f79c
Merge remote-tracking branch 'origin/test-deploy' into test-deploy
scholar-star May 17, 2026
14550d6
Feature/navigation (#11)
ziuneeeeeee May 19, 2026
59ff811
변수 중복 입력 문제 수정
scholar-star May 19, 2026
5b82075
오타 수정
scholar-star May 19, 2026
52eea11
오타 수정
scholar-star May 19, 2026
82db949
누락된 Loading20 Import 수정
scholar-star May 19, 2026
fafb7a6
누락된 featuredRef 수정
scholar-star May 19, 2026
5ab9098
한국 시간대로 영업 여부 구하는 로직 변경
scholar-star May 20, 2026
aaff2ae
카카오 리다이렉트 테스트 사이트에 맞게 수정
scholar-star May 20, 2026
087ec3d
카카오 리다이렉트 테스트 사이트에 맞게 수정
scholar-star May 20, 2026
9f97ac7
카카오 리다이렉트 테스트 사이트에 맞게 수정
scholar-star May 21, 2026
2c2f4f2
리다이렉션 로직 test 사이트에 머지
scholar-star May 27, 2026
831f5ba
이미지 비동기 처리 로직 머지
scholar-star May 27, 2026
f351685
Update request matchers in SecurityConfig
scholar-star May 27, 2026
a2e0df6
리다이렉트가 localhost로 변하는 버그 수정, NAVER API 키 숨김
scholar-star May 27, 2026
b38e9f9
Merge remote-tracking branch 'origin/test-deploy' into test-deploy
scholar-star May 27, 2026
82d58ad
마이페이지 대비 모든 URL open하는 부분을 조정
scholar-star May 29, 2026
924f953
마이페이지 대비 모든 URL open하는 부분을 조정
scholar-star May 29, 2026
c4213d9
일단 오래 걸리리라 판단하고 롤백
scholar-star May 29, 2026
76ed3a8
permitAll에 assets도 추가
scholar-star May 30, 2026
802d7cc
permitAll에 /index.html 추가
scholar-star May 30, 2026
06c432f
OAuth2 로그인 페이지 지정
scholar-star May 30, 2026
1dd210a
day가 JAVA에서 1(월요일)~7(일요일)로 반영되는 부분을 나머지 연산을 통해 수정
scholar-star May 31, 2026
828c428
길찾기 페이지에서 새로고침이 잘 되지 않아 수정.
scholar-star May 31, 2026
a8ba61f
머지커밋
seung721 Jun 1, 2026
bf2d0f5
머지커밋
seung721 Jun 1, 2026
608ac08
redirect url 머지커밋
seung721 Jun 1, 2026
14e5cb8
redirect url
seung721 Jun 1, 2026
dc9044e
baseURL을 하드코딩하지 않고 root로 수정
scholar-star Jun 1, 2026
6eba81e
SDK 호출부 수정
scholar-star Jun 1, 2026
d7a82e3
redirect url 부분 수정
scholar-star Jun 1, 2026
480d17e
redirect url 로깅
scholar-star Jun 1, 2026
702d73f
redirect url 로깅
scholar-star Jun 1, 2026
78cdb1a
redirect url 넘기는 부분 백엔드 파트 수정
scholar-star Jun 1, 2026
0b226dd
redirect url 넘기는 부분 로깅
scholar-star Jun 1, 2026
3550a47
오타 수정
scholar-star Jun 1, 2026
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
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
./backend/.env
./backend/.env.dev
21 changes: 21 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@


# 서버 설정
SERVER_PORT=8081

# JWT
JWT_SECRET=E+4xWdVSsUj9yEzS0k4w7EoVb0avEe8lcVy97m/ryuZWhVOT9Mb0tZf9VY9drZqJ61JoKy+7Oy0XgVtungp7Xg==
ACCESS_TOKEN_EXPIRATION=3600000
REFRESH_TOKEN_EXPIRATION=1209600000

#Tmap API
TMAP_API_KEY=nU2JJjzFoN5xPAF7Dsr4L7OQZdbzHOT37MXawRA5

# DB
POSTGRESQL_PASSWORD=103009 ##이거떄문에 Jwt토큰문제가 발생했던거
POSTGRESQL_URL=jdbc:postgresql://onmyway.cb0u0uogmu8b.ap-northeast-2.rds.amazonaws.com:5432/onmyway_test_db

# OAuth
KAKAO_REDIRECT=https://test.onmyway.cloud/login/oauth2/code/kakao
KAKAO_CLIENT_ID=f9d8a7f56f7d4bbb1986a59c62baf185
KAKAO_CLIENT_SECRET=JM8E9jXfOj10KdvZhiCld8DxHi8KPIuG
60 changes: 60 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: CI/CD Docker to Server

on:
push:
branches: [ "test-deploy" ] # test-deploy 브랜치에 push될 때 실행

jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: 체크아웃 소스코드
uses: actions/checkout@v4

- name: Docker Buildx 설정
uses: docker/setup-buildx-action@v3

- name: Docker Hub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Docker 이미지 빌드 및 푸시
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/onmyway:test

deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: SSH로 서버 접속 및 배포 명령 실행
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
script: |
# 1. Docker Hub 로그인
echo "${{ secrets.DOCKERHUB_TOKEN }}" | sudo docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin

# 2. 최신 이미지 Pull
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/onmyway:test

# 3. 기존에 실행 중인 동일한 이름의 컨테이너 중지 및 삭제
sudo docker stop test-onmyway || true
sudo docker rm test-onmyway || true

# 5. ⭐ --env-file 옵션을 사용하여 컨테이너 실행
sudo docker run -d \
--name test-onmyway \
-p 8081:8081 \
--env-file .env.dev \
${{ secrets.DOCKERHUB_USERNAME }}/onmyway:test

# 6. 사용하지 않는 구버전 이미지 청소
sudo docker image prune -f
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ bin/
out/
!**/src/main/**/out/
!**/src/test/**/out/
.env
backend/.env

### NetBeans ###
/nbproject/private/
Expand All @@ -196,7 +196,8 @@ out/
# =========================
# Env files
# =========================
.env
backend/.env
backend/.env.dev

# =========================
# Git 내부
Expand Down
11 changes: 5 additions & 6 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 0 additions & 17 deletions .idea/dataSources.xml

This file was deleted.

3 changes: 3 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 36 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# --- 1단계: Frontend 빌드 ---
FROM node:24 AS frontend-builder
WORKDIR /build-fe
COPY frontend/ganeungil/package*.json ./
RUN npm install
COPY frontend/ganeungil ./
RUN npm run build

# --- 2단계: Backend 빌드 (FE 결과물 포함) ---
FROM gradle:7.6-jdk17 AS backend-builder
WORKDIR /build-be
# 1. 설정 파일만 먼저 복사
COPY ./backend/gradlew .
COPY ./backend/gradle/ gradle/
COPY ./backend/build.gradle ./backend/settings.gradle ./

# 2. 의존성 미리 다운로드 (이 단계가 캐싱되어 다음엔 1초만에 넘어감)
RUN ./gradlew dependencies --no-daemon

# 3. 그 다음 소스 복사 및 빌드
COPY . .
# 위에서 빌드한 FE 정적 파일들을 BE의 static 폴더로 복사
COPY --from=frontend-builder /build-fe/dist ./backend/src/main/resources/static
COPY backend/src ./src

RUN ./gradlew -p ./backend bootJar --no-daemon

# --- 3단계: 최종 실행 이미지 ---
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
RUN ls -R /app
# 빌드된 jar 파일만 가져오기
COPY --from=backend-builder /build-be/backend/build/libs/*.jar app.jar

EXPOSE 8081
ENTRYPOINT ["java", "-jar", "app.jar"]
12 changes: 12 additions & 0 deletions backend/.idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 0 additions & 8 deletions backend/.idea/modules.xml

This file was deleted.

2 changes: 1 addition & 1 deletion backend/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 2 additions & 0 deletions backend/settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
rootProject.name = 'onmyway'
include 'frontend'
include 'backend'
16 changes: 16 additions & 0 deletions backend/src/main/java/_team/onmyway/config/ErrorConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package _team.onmyway.config;

import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;

@Configuration
public class ErrorConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error404 = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
registry.addErrorPages(error404);
}
}
42 changes: 40 additions & 2 deletions backend/src/main/java/_team/onmyway/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package _team.onmyway.config;

import _team.onmyway.repository.cookie.CookieAuthorizationRequestRepository;
import _team.onmyway.security.OAuthFailureHandler;
import _team.onmyway.security.OAuthSuccessHandler;
import _team.onmyway.security.JwtAuthenticationFilter;
import _team.onmyway.service.CustomOAuthUserService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
Expand All @@ -20,18 +28,26 @@
@Configuration
@RequiredArgsConstructor
public class SecurityConfig {


private final ClientRegistrationRepository clientRegistrationRepository;
private final CustomOAuthUserService customOAuthUserService;
private final OAuthSuccessHandler successHandler;
private final OAuthFailureHandler failureHandler;
private final JwtAuthenticationFilter jwtAuthenticationFilter;
private final CookieAuthorizationRequestRepository cookieRepository;

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(authorizeRequests -> authorizeRequests
.requestMatchers(
"/",
"/find-route",
"/index.html",
"/assets/**",
"/login",
"/error",
"/oauth2/authorization/**",
"/login/oauth2/code/**",
"/api/auth/**",
Expand All @@ -40,6 +56,7 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
"/places/**",
"/route/**"
).permitAll() // 요청을 보낸 이가 누구이든 상관없이 통과되는 URL.
.requestMatchers( "/css/**", "/js/**", "/images/**", "/favicon.ico").permitAll()
.anyRequest().authenticated()
)
.csrf(csrf -> csrf.disable())
Expand All @@ -48,14 +65,18 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
.logout(logout -> logout.disable())
.sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.oauth2Login(oauth -> oauth
// oauth2를 이용할 때 로그인 시 사용할 로그인 페이지 지정(Custom)
.loginPage("/login")
.authorizationEndpoint(authEndpoint -> authEndpoint
.baseUri("/oauth2/authorization")
.authorizationRequestRepository(cookieRepository))
.userInfoEndpoint(userInfoEndpoint -> userInfoEndpoint.userService(customOAuthUserService)) // 사용자 정보 이용(회원가입 등)
.successHandler(successHandler) // 로그인 완료 시 이동할 곳
.failureHandler(failureHandler) // 로그인 실패 시 이동할 곳
);

// JWT Filter 등록
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);

return http.build();
}

Expand All @@ -74,4 +95,21 @@ public CorsConfigurationSource corsConfigurationSource() {

return source;
}

private OAuth2AuthorizationRequestResolver customOAuth2AuthorizationRequestResolver() {
DefaultOAuth2AuthorizationRequestResolver resolver =
new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/oauth2/authorization");

resolver.setAuthorizationRequestCustomizer(builder -> {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
String redirectUri = request.getParameter("redirect-url");
if (redirectUri != null) {
builder.additionalParameters(params -> params.put("custom_redirect_uri", redirectUri));
}
}
});
return resolver;
}
}
12 changes: 12 additions & 0 deletions backend/src/main/java/_team/onmyway/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package _team.onmyway.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index.html";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import _team.onmyway.service.RecommendationService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

@RestController
@RequiredArgsConstructor
Expand All @@ -14,7 +15,7 @@ public class RecommendationController {

// 전체 카테고리 로드: 카테고리별 7개(대표 포함) + 메인용 대표 1개
@GetMapping("/recommend")
public AllCategoryRecommendationsDTO recommendAllCategories(
public Mono<AllCategoryRecommendationsDTO> recommendAllCategories(
@RequestParam double lat,
@RequestParam double lng
) {
Expand Down
Loading
Loading