From 671731c5424bcad62f49e56922376a2d2207e159 Mon Sep 17 00:00:00 2001 From: Whal3 Date: Sat, 14 Feb 2026 18:32:31 +0900 Subject: [PATCH 1/6] [HG]docs(#233): update readme file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7b4e54..5312ef6 100644 --- a/README.md +++ b/README.md @@ -50,4 +50,4 @@ $ git submodule update ## application.yml 업데이트 ``` bash $ git submodule update —remote -``` \ No newline at end of file +``` From 2dc08eaa25710218cdcc4dca222909b65c0b8f40 Mon Sep 17 00:00:00 2001 From: Whal3 Date: Wed, 18 Feb 2026 16:09:46 +0900 Subject: [PATCH 2/6] ci: test deploy setup --- .github/workflows/test-server-deploy | 68 ++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/test-server-deploy diff --git a/.github/workflows/test-server-deploy b/.github/workflows/test-server-deploy new file mode 100644 index 0000000..5e1a5a0 --- /dev/null +++ b/.github/workflows/test-server-deploy @@ -0,0 +1,68 @@ +name: Build & Deploy + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x ./gradlew + + - name: Build Spring Boot + run: ./gradlew clean bootJar + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker Hub Login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build & Push Docker Image + uses: docker/build-push-action@v6 + with: + context: . + push: true + platforms: linux/arm64 + tags: | + lkyoung/craweb:latest + lkyoung/craweb:${{ github.sha }} + + - name: Deploy via SSH + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SERVER_USER }} + port: ${{ secrets.SERVER_SSH_PORT }} + key: ${{ secrets.SERVER_SSH_KEY }} + script: | + set -e + + cd ~/cra-web-test + + echo "${{ secrets.SERVER_USER_PASSWORD }}" | sudo -S docker login \ + -u ${{ secrets.DOCKERHUB_USERNAME }} \ + -p ${{ secrets.DOCKERHUB_TOKEN }} + + echo "${{ secrets.SERVER_USER_PASSWORD }}" | sudo -S docker compose up -d --pull always + echo "${{ secrets.SERVER_USER_PASSWORD }}" | sudo -S docker logout From 1eaa82803b27f9e4e52fc8760536c39e3a2e3ee4 Mon Sep 17 00:00:00 2001 From: Whal3 Date: Wed, 18 Feb 2026 16:11:03 +0900 Subject: [PATCH 3/6] ci: update ci options --- .github/workflows/test-server-deploy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-server-deploy b/.github/workflows/test-server-deploy index 5e1a5a0..e198f0a 100644 --- a/.github/workflows/test-server-deploy +++ b/.github/workflows/test-server-deploy @@ -2,8 +2,10 @@ name: Build & Deploy on: push: - branches: - - main + branches: [dev] + + pull_request: + branches: [dev] jobs: build-and-deploy: From 767a3ffd6970c7876ff67ddef82491c42a568944 Mon Sep 17 00:00:00 2001 From: Whal3 Date: Wed, 18 Feb 2026 16:12:53 +0900 Subject: [PATCH 4/6] ci: update file --- .github/workflows/{test-server-deploy => test-server-deploy.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{test-server-deploy => test-server-deploy.yml} (100%) diff --git a/.github/workflows/test-server-deploy b/.github/workflows/test-server-deploy.yml similarity index 100% rename from .github/workflows/test-server-deploy rename to .github/workflows/test-server-deploy.yml From d5c802167bc9bacb51ff474664f42c0a0116555c Mon Sep 17 00:00:00 2001 From: Whal3 Date: Mon, 23 Feb 2026 00:58:29 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[HG]hotfix:=20test-server=20cors=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handong/cra/crawebbackend/config/WebSecurityConfig.java | 5 ++++- src/main/resources/config/application-deploy.yml | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/handong/cra/crawebbackend/config/WebSecurityConfig.java b/src/main/java/com/handong/cra/crawebbackend/config/WebSecurityConfig.java index 520e0a0..1ae57bd 100644 --- a/src/main/java/com/handong/cra/crawebbackend/config/WebSecurityConfig.java +++ b/src/main/java/com/handong/cra/crawebbackend/config/WebSecurityConfig.java @@ -37,6 +37,9 @@ public class WebSecurityConfig { @Value("${site.frontend.url}") private String frontUrl; + @Value("${dev-site.test-server.url}") + private String testServerUrl; + @Bean public JwtAuthenticationFilter jwtAuthenticationFilter() { return new JwtAuthenticationFilter(jwtTokenProvider, userDetailsService, userRepository); @@ -98,7 +101,7 @@ public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws E @Bean public CorsConfigurationSource corsConfigurationSource() { final CorsConfiguration configuration = new CorsConfiguration(); - configuration.setAllowedOrigins(List.of("http://localhost:5173", "https://test.cra206.org", frontUrl)); // React 앱 도메인 허용 + configuration.setAllowedOrigins(List.of("http://localhost:5173", frontUrl, testServerUrl)); configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); configuration.setAllowedHeaders(List.of("*")); // 모든 헤더 허용 configuration.setAllowCredentials(true); // 쿠키 허용 diff --git a/src/main/resources/config/application-deploy.yml b/src/main/resources/config/application-deploy.yml index 0cb2111..ea757ae 100644 --- a/src/main/resources/config/application-deploy.yml +++ b/src/main/resources/config/application-deploy.yml @@ -58,3 +58,9 @@ logging: com.handong.cra.crawebbackend: info file: name: ${LOG_FILE} + +dev-site: + test-server: + url: ${DEV-SITE_TEST-SERVER_URL} + + From 1bd3cc98a0d44cc56c3154bd9c9bdffc85e549fc Mon Sep 17 00:00:00 2001 From: chanhk-im Date: Thu, 23 Apr 2026 00:55:42 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[CH]=20refactor[#237]:=20Board-User-Like=20?= =?UTF-8?q?n+1=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/handong/cra/crawebbackend/board/domain/Board.java | 3 +++ .../cra/crawebbackend/board/repository/BoardRepository.java | 2 +- .../java/com/handong/cra/crawebbackend/user/domain/User.java | 3 ++- .../com/handong/cra/crawebbackend/user/domain/UserRoleSet.java | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/handong/cra/crawebbackend/board/domain/Board.java b/src/main/java/com/handong/cra/crawebbackend/board/domain/Board.java index 240969c..97e19a7 100644 --- a/src/main/java/com/handong/cra/crawebbackend/board/domain/Board.java +++ b/src/main/java/com/handong/cra/crawebbackend/board/domain/Board.java @@ -7,6 +7,7 @@ import com.handong.cra.crawebbackend.user.domain.User; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.BatchSize; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField; import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed; @@ -43,9 +44,11 @@ public class Board extends BaseEntity { @Setter private List imageUrls = new ArrayList<>(); + @BatchSize(size = 100) @OneToMany(mappedBy = "board", cascade = CascadeType.ALL, orphanRemoval = true) private List comments; + @BatchSize(size = 100) @ManyToMany(mappedBy = "likedBoards") private List likedUsers = new ArrayList<>(); diff --git a/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java b/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java index 869f8bd..840a6e8 100644 --- a/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java +++ b/src/main/java/com/handong/cra/crawebbackend/board/repository/BoardRepository.java @@ -18,9 +18,9 @@ public interface BoardRepository extends JpaRepository { List findAllByCategoryAndDeletedFalse(Category category); + @Query("SELECT b FROM Board b JOIN FETCH b.user WHERE b.category = :category AND b.deleted = false") Page findAllByCategoryAndDeletedFalse(Category category, Pageable pageable); - @EntityGraph(attributePaths = {"likedUsers"}) Optional findBoardByIdAndDeletedFalse(Long id); List findByCategory(Category category); diff --git a/src/main/java/com/handong/cra/crawebbackend/user/domain/User.java b/src/main/java/com/handong/cra/crawebbackend/user/domain/User.java index 86749b5..c4576ee 100644 --- a/src/main/java/com/handong/cra/crawebbackend/user/domain/User.java +++ b/src/main/java/com/handong/cra/crawebbackend/user/domain/User.java @@ -31,6 +31,7 @@ public class User extends BaseEntity { @Column(name = "github_id", nullable = false) private String githubId; + private UserRoleSet roles; @Column(name = "student_id", unique = true, nullable = false) @@ -46,7 +47,7 @@ public class User extends BaseEntity { @Column(name = "img_url") private String imgUrl; - @ManyToMany(fetch = FetchType.EAGER) + @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "likes", joinColumns = @JoinColumn(name = "user_id"), diff --git a/src/main/java/com/handong/cra/crawebbackend/user/domain/UserRoleSet.java b/src/main/java/com/handong/cra/crawebbackend/user/domain/UserRoleSet.java index 1839483..de150b7 100644 --- a/src/main/java/com/handong/cra/crawebbackend/user/domain/UserRoleSet.java +++ b/src/main/java/com/handong/cra/crawebbackend/user/domain/UserRoleSet.java @@ -14,7 +14,7 @@ @Embeddable @NoArgsConstructor(access = AccessLevel.PROTECTED) public class UserRoleSet { - @ElementCollection(fetch = FetchType.EAGER) + @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "roles", joinColumns = @JoinColumn(name = "user_id")) @Enumerated(EnumType.STRING) private Set roles = new HashSet<>();