Skip to content

Commit ec73134

Browse files
rjswjddnchw0912
andauthored
release: 병합 (#81)
* feat: workflow에 EC2 자동 배포 추가 (#78) * feat: workflow에 EC2 자동 배포 추가 * chore: appleboy/ssh-action 최신버전으로 변경 * feat: 발표방 캐싱 및 인덱싱 적용 feat 새로운 기능 추가 (#80) * docs: 발표방 생성 요청 dto 스웨거 수정 * feat: Room secretCode Unique 설정 * feat: Room 캐시 적용 * test: Room 캐시 테스트 * test: 비밀코드 중복 문제 해결 * fix: 로그인 500에러 수정 * fix: 로그인 500에러 수정 --------- Co-authored-by: Huiwoong Choi <[email protected]>
1 parent a7fea27 commit ec73134

File tree

15 files changed

+262
-28
lines changed

15 files changed

+262
-28
lines changed

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ dependencies {
3030
implementation 'org.springframework.boot:spring-boot-starter-security'
3131
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
3232
implementation 'org.springframework.boot:spring-boot-starter-validation'
33+
implementation 'org.springframework.boot:spring-boot-starter-cache'
3334
testImplementation 'org.springframework.security:spring-security-test'
3435

3536
compileOnly 'org.projectlombok:lombok'
@@ -58,6 +59,10 @@ dependencies {
5859

5960
// bucket4j
6061
implementation 'com.bucket4j:bucket4j_jdk17-core:8.14.0'
62+
63+
// caffeine
64+
implementation 'com.github.ben-manes.caffeine:caffeine'
65+
6166
}
6267

6368
tasks.named('test') {

src/main/java/com/oronaminc/join/emoji/service/EmojiFacade.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.oronaminc.join.emoji.service;
22

3+
import org.springframework.orm.ObjectOptimisticLockingFailureException;
4+
import org.springframework.stereotype.Service;
5+
36
import com.oronaminc.join.emoji.dto.EmojiRequest;
47
import com.oronaminc.join.emoji.dto.EmojiResponse;
58
import com.oronaminc.join.global.exception.ErrorCode;
69
import com.oronaminc.join.global.exception.ErrorException;
10+
711
import lombok.RequiredArgsConstructor;
8-
import org.springframework.orm.ObjectOptimisticLockingFailureException;
9-
import org.springframework.stereotype.Service;
1012

1113
@Service
1214
@RequiredArgsConstructor
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.oronaminc.join.global.config;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.concurrent.TimeUnit;
6+
7+
import org.springframework.cache.CacheManager;
8+
import org.springframework.cache.annotation.EnableCaching;
9+
import org.springframework.cache.caffeine.CaffeineCache;
10+
import org.springframework.cache.support.SimpleCacheManager;
11+
import org.springframework.context.annotation.Bean;
12+
import org.springframework.context.annotation.Configuration;
13+
14+
import com.github.benmanes.caffeine.cache.Caffeine;
15+
import com.github.benmanes.caffeine.cache.Scheduler;
16+
17+
@EnableCaching
18+
@Configuration
19+
public class CacheConfig {
20+
21+
@Bean
22+
public CacheManager cacheManager() {
23+
List<CaffeineCache> caches = Arrays.stream(CacheType.values())
24+
.map(cache -> new CaffeineCache(
25+
cache.cacheName,
26+
Caffeine.newBuilder()
27+
.expireAfterWrite(cache.expireAfterWrite, TimeUnit.SECONDS)
28+
.maximumSize(cache.maximumSize)
29+
.scheduler(Scheduler.systemScheduler())
30+
.build()
31+
)
32+
)
33+
.toList();
34+
35+
SimpleCacheManager cacheManager = new SimpleCacheManager();
36+
cacheManager.setCaches(caches);
37+
38+
return cacheManager;
39+
}
40+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.oronaminc.join.global.config;
2+
3+
import lombok.AllArgsConstructor;
4+
5+
@AllArgsConstructor
6+
public enum CacheType {
7+
ROOM_BY_ID("roomById", 300, 1000),
8+
ROOM_BY_SECRET_CODE("roomBySecretCode", 300, 1000)
9+
;
10+
11+
public final String cacheName;
12+
public final long expireAfterWrite;
13+
public final long maximumSize;
14+
}

src/main/java/com/oronaminc/join/global/dev/DevController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
import com.oronaminc.join.member.domain.MemberType;
1919
import com.oronaminc.join.member.security.MemberDetails;
2020

21+
import io.swagger.v3.oas.annotations.tags.Tag;
2122
import jakarta.servlet.http.HttpServletRequest;
2223
import jakarta.servlet.http.HttpSession;
2324
import lombok.RequiredArgsConstructor;
2425

2526
@RestController
27+
@Tag(name = "개발용 API")
2628
@RequestMapping("/dev")
2729
@RequiredArgsConstructor
2830
public class DevController {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.oronaminc.join.global.dev;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.ResponseStatus;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
11+
@RestController
12+
@Tag(name = "개발용 API")
13+
public class HealthController {
14+
15+
@Operation(summary = "애플리케이션 헬스체크")
16+
@ResponseStatus(HttpStatus.OK)
17+
@GetMapping("/health")
18+
public String health() {
19+
return "Server is Healthy!";
20+
}
21+
22+
@Operation(summary = "홈 헬스체크")
23+
@ResponseStatus(HttpStatus.OK)
24+
@GetMapping("/")
25+
public String home() {
26+
return "It's Home!";
27+
}
28+
}

src/main/java/com/oronaminc/join/member/security/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.springframework.context.annotation.Bean;
66
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.context.annotation.Profile;
78
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
89
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
910
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
@@ -12,6 +13,7 @@
1213
import lombok.RequiredArgsConstructor;
1314

1415
@Configuration
16+
@Profile("!test")
1517
@EnableWebSecurity
1618
@RequiredArgsConstructor
1719
public class SecurityConfig {
@@ -47,5 +49,4 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
4749
.logout(withDefaults())
4850
.build();
4951
}
50-
5152
}

src/main/java/com/oronaminc/join/room/domain/Room.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.oronaminc.join.global.entity.BaseEntity;
77
import com.oronaminc.join.room.dto.RoomUpdateRequest;
88

9+
import jakarta.persistence.Column;
910
import jakarta.persistence.Entity;
1011
import jakarta.persistence.EnumType;
1112
import jakarta.persistence.Enumerated;
@@ -33,6 +34,7 @@ public class Room extends BaseEntity {
3334
private String title;
3435
private String description;
3536

37+
@Column(unique = true)
3638
private String secretCode;
3739

3840
@Enumerated(EnumType.STRING)

src/main/java/com/oronaminc/join/room/dto/CreateRoomRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.oronaminc.join.room.dto;
22

3-
import io.swagger.v3.oas.annotations.media.Schema;
43
import java.time.LocalDate;
54
import java.util.List;
65

76
import org.hibernate.validator.constraints.Length;
87

8+
import io.swagger.v3.oas.annotations.media.Schema;
99
import jakarta.validation.constraints.FutureOrPresent;
1010
import jakarta.validation.constraints.Max;
1111
import jakarta.validation.constraints.NotBlank;
@@ -38,7 +38,7 @@ public record CreateRoomRequest(
3838

3939
@NotNull
4040
@Size(max = 5)
41-
@Schema(description = "발표방 추가한 팀원 목록", example = "{팀원[email protected], 팀원[email protected]}")
41+
@Schema(description = "발표방 추가한 팀원 목록")
4242
List<String> teamEmail
4343
) {
4444
}

src/main/java/com/oronaminc/join/room/service/RoomReader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import java.util.Optional;
66

7+
import org.springframework.cache.annotation.Cacheable;
78
import org.springframework.stereotype.Component;
89

910
import com.oronaminc.join.global.exception.ErrorException;
@@ -26,6 +27,12 @@ public Room getById(Long roomId) {
2627
.orElseThrow(() -> new ErrorException(NOT_FOUND_ROOM));
2728
}
2829

30+
@Cacheable(cacheNames = "roomById")
31+
public Room getCacheById(Long roomId) {
32+
return findById(roomId)
33+
.orElseThrow(() -> new ErrorException(NOT_FOUND_ROOM));
34+
}
35+
2936
public Optional<Room> findBySecretCode(String secretCode) {
3037
return roomRepository.findBySecretCode(secretCode);
3138
}
@@ -35,6 +42,12 @@ public Room getBySecretCode(String secretCode) {
3542
.orElseThrow(() -> new ErrorException(NOT_FOUND_ROOM));
3643
}
3744

45+
@Cacheable(cacheNames = "roomBySecretCode")
46+
public Room getCacheBySecretCode(String secretCode) {
47+
return this.findBySecretCode(secretCode)
48+
.orElseThrow(() -> new ErrorException(NOT_FOUND_ROOM));
49+
}
50+
3851
public Boolean existsBySecretCode(String secretCode) {
3952
return roomRepository.existsBySecretCode(secretCode);
4053
}

0 commit comments

Comments
 (0)