Skip to content

Commit 5b17a89

Browse files
committed
feat: 세션 모두 조회 기능 완료
맵 스트럭트 적용 및 페이징 적용예정
1 parent ee4bd66 commit 5b17a89

6 files changed

Lines changed: 127 additions & 6 deletions

File tree

build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ dependencies {
4141
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.6'
4242
//유효성 검사
4343
implementation 'org.springframework.boot:spring-boot-starter-validation'
44+
// 맵 스트럭트 API
45+
implementation 'org.mapstruct:mapstruct:1.6.3'
46+
annotationProcessor 'org.projectlombok:lombok'
47+
// 맵 스트럭트 어노테이션 프로세서 (수정됨)
48+
annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3'
49+
// 롬복과의 충돌 방지
50+
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
4451

4552
}
4653

src/main/java/com/waitit/capstone/domain/client/manager/HostController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import com.waitit.capstone.domain.client.manager.dto.HostRequest;
44
import com.waitit.capstone.domain.client.manager.dto.HostResponse;
5+
import com.waitit.capstone.domain.client.manager.dto.SessionListDto;
56
import java.util.HashMap;
7+
import java.util.List;
68
import java.util.Map;
79
import lombok.AllArgsConstructor;
810
import org.springframework.http.HttpStatus;
@@ -13,6 +15,7 @@
1315
import org.springframework.web.bind.annotation.RequestBody;
1416
import org.springframework.web.bind.annotation.RequestMapping;
1517
import org.springframework.web.bind.annotation.RequestParam;
18+
import org.springframework.web.bind.annotation.ResponseBody;
1619
import org.springframework.web.bind.annotation.RestController;
1720

1821
@AllArgsConstructor
@@ -34,8 +37,16 @@ public ResponseEntity<?> saveHost(@RequestBody HostRequest request){
3437
}
3538

3639
@GetMapping("/{id}")
40+
@ResponseBody
3741
public ResponseEntity<HostResponse> getHost(@PathVariable Long id){
3842
HostResponse response = hostService.getHost(id);
3943
return ResponseEntity.status(HttpStatus.OK).body(response);
4044
}
45+
46+
@GetMapping("/sessions")
47+
@ResponseBody
48+
public ResponseEntity<List<SessionListDto>> getSessionList(){
49+
List<SessionListDto> sessions = hostService.getAllSessions();
50+
return ResponseEntity.status(HttpStatus.OK).body(sessions);
51+
}
4152
}

src/main/java/com/waitit/capstone/domain/client/manager/HostService.java

Lines changed: 86 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,110 @@
22

33
import com.waitit.capstone.domain.client.manager.dto.HostRequest;
44
import com.waitit.capstone.domain.client.manager.dto.HostResponse;
5+
import com.waitit.capstone.domain.client.manager.dto.SessionListDto;
6+
import java.time.Duration;
7+
import java.time.LocalDateTime;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import java.util.Set;
11+
import java.util.stream.Collectors;
512
import lombok.AllArgsConstructor;
13+
import org.springframework.data.redis.core.StringRedisTemplate;
614
import org.springframework.stereotype.Service;
715

816
@AllArgsConstructor
917
@Service
1018
public class HostService {
1119
private final HostRepository hostRepository;
20+
private final StringRedisTemplate redisTemplate;
21+
private static final String ACTIVE_HOSTS_KEY = "active:hosts";
1222

13-
public boolean hostExist(Long id){
23+
public boolean hostExist(Long id) {
1424
return true;
1525
}
26+
1627
//호스트 정보 저장
17-
public void saveHost(HostRequest request){
28+
public void saveHost(HostRequest request) {
1829
Host host = request.toEntity();
30+
String key = "waitList" + host.getId();
1931
hostRepository.save(host);
20-
//레디스에 세션 올리기 필요
32+
//세션 등록
33+
redisTemplate.opsForList().rightPush(key, host.getHostName());
34+
// 활성 호스트 Set 호스트 ID 추가
35+
redisTemplate.opsForSet().add(ACTIVE_HOSTS_KEY, host.getId().toString());
36+
}
37+
38+
// 호스트 세션 비활성화
39+
public void deactivateHost(Long hostId) {
40+
// 활성 호스트 Set에서 호스트 ID 제거
41+
redisTemplate.opsForSet().remove(ACTIVE_HOSTS_KEY, hostId.toString());
2142
}
2243

23-
//요청받은 아이디로 db에서 호스트 조회
24-
public HostResponse getHost(Long id){
44+
//요청받은 아이디로 db에 호스트 조회
45+
public HostResponse getHost(Long id) {
2546
Host host = hostRepository.findHostById(id);
2647
return HostResponse.from(host);
2748
}
2849

50+
public List<SessionListDto> getAllSessions() {
51+
List<SessionListDto> result = new ArrayList<>();
52+
53+
// Redis Set에서 활성 호스트 ID 목록 가져오기
54+
Set<String> activeHostIds = redisTemplate.opsForSet().members(ACTIVE_HOSTS_KEY);
55+
56+
if (activeHostIds != null && !activeHostIds.isEmpty()) {
57+
// 문자열 ID를 Long 변환
58+
List<Long> hostIds = activeHostIds.stream()
59+
.map(Long::parseLong)
60+
.collect(Collectors.toList());
61+
62+
// 활성 호스트만 DB 조회
63+
List<Host> activeHosts = hostRepository.findAllById(hostIds);
64+
65+
for (Host host : activeHosts) {
66+
String waitListKey = "waitList" + host.getId();
67+
68+
// 대기 인원 수 계산
69+
Long waitingCount = redisTemplate.opsForList().size(waitListKey);
70+
71+
// 예상 시간 계산 (시작 시간부터 종료 시간까지)
72+
String estimatedTime = calculateEstimatedTime(host.getStartTime(), host.getEndTime());
73+
74+
// DTO 생성 및 추가
75+
SessionListDto sessionDto = SessionListDto.builder()
76+
.hostId(host.getId())
77+
.hostName(host.getHostName())
78+
.imgUrl(host.getImgUrl())
79+
.estimatedTime(estimatedTime)
80+
.waitingCount(waitingCount != null ? waitingCount.intValue() : 0)
81+
.build();
82+
83+
result.add(sessionDto);
84+
}
85+
}
86+
87+
return result;
88+
}
89+
90+
// 호스트가 활성 상태인지 확인
91+
public boolean isHostActive(Long hostId) {
92+
return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(ACTIVE_HOSTS_KEY, hostId.toString()));
93+
}
94+
95+
// 예상 시간 계산 메소드
96+
private String calculateEstimatedTime(LocalDateTime startTime, LocalDateTime endTime) {
97+
if (startTime == null || endTime == null) {
98+
return "미정";
99+
}
29100

101+
Duration duration = Duration.between(startTime, endTime);
102+
long hours = duration.toHours();
103+
long minutes = duration.toMinutesPart();
104+
105+
if (hours > 0) {
106+
return hours + "시간 " + (minutes > 0 ? minutes + "분" : "");
107+
} else {
108+
return minutes + "분";
109+
}
110+
}
30111
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.waitit.capstone.domain.client.manager.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Builder
9+
public record SessionListDto(
10+
Long hostId,
11+
String hostName,
12+
String imgUrl,
13+
String estimatedTime, // 예상 시간 (시작-종료 시간으로부터 계산)
14+
int waitingCount){} // 대기 인원 수

src/main/java/com/waitit/capstone/global/config/RedisConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.springframework.context.annotation.Configuration;
55
import org.springframework.data.redis.connection.RedisConnectionFactory;
66
import org.springframework.data.redis.core.RedisTemplate;
7+
import org.springframework.data.redis.core.StringRedisTemplate;
78
import org.springframework.data.redis.serializer.StringRedisSerializer;
89

910
@Configuration
@@ -16,4 +17,10 @@ public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisCo
1617
template.setValueSerializer(new StringRedisSerializer());
1718
return template;
1819
}
20+
@Bean
21+
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
22+
StringRedisTemplate template = new StringRedisTemplate();
23+
template.setConnectionFactory(connectionFactory);
24+
return template;
25+
}
1926
}

src/main/resources/application.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
99

1010
# hibernate
1111
#none?? ?? ??
12-
spring.jpa.hibernate.ddl-auto=create
12+
spring.jpa.hibernate.ddl-auto=update
1313
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
1414

1515
# jwt secret key
@@ -18,3 +18,4 @@ spring.jwt.secret=${SPRING_JWT_SECRET}
1818
# Redis
1919
spring.data.redis.host=${SPRING_REDIS_HOST}
2020
spring.data.redis.port=${SPRING_REDIS_PORT}
21+

0 commit comments

Comments
 (0)