최종 프로젝트가 시작되고 며칠이 지났다
일단 기능 분배를 했는데, 내가 팀에서 상대적으로 실력이 부족하다 보니 제일 쉬운 CRUD를 맡았다
스페이스 쪽 api와 erd는 이렇게 짰다.
이렇게 짰고 , erd는 그냥 저번에 한거 그대로 가긴했다.
기본적인 CRUD 코드이다 스페이스 부분 api와 erd만 잘 설계한다면 그렇게까지 어렵지 않다
@RestController
@RequiredArgsConstructor
@RequestMapping("/spaces")
public class SpaceController {
private final SpaceFacade spaceFacade;
@PostMapping
public Mono<ResponseEntity<SpaceResponseDto>> createSpace(@RequestBody SpaceRequestDto requestDto) {
return spaceFacade.createSpace(requestDto)
.map(ResponseEntity::ok);
}
@PutMapping("/{spaceId}")
public Mono<ResponseEntity<SpaceResponseDto>> updateSpace(@PathVariable Long spaceId, @RequestBody SpaceRequestDto requestDto) {
return spaceFacade.updateSpace(spaceId, requestDto)
.map(ResponseEntity::ok);
}
@GetMapping("/public")
public Flux<SpaceResponseDto> getAllPublicSpaces() {
return spaceFacade.getAllPublicSpaces();
}
@GetMapping("/{spaceId}")
public Mono<ResponseEntity<SpaceResponseDto>> getSpaceById(@PathVariable Long spaceId) {
return spaceFacade.getSpaceById(spaceId)
.map(ResponseEntity::ok);
}
@DeleteMapping("/{spaceId}")
public Mono<ResponseEntity<String>> deleteSpace(@PathVariable Long spaceId) {
return spaceFacade.deleteSpace(spaceId)
.then(Mono.just(ResponseEntity.ok("삭제 완료입니다")));
}
}
package com.echo.echo.domain.space;
import com.echo.echo.domain.space.dto.SpaceRequestDto;
import com.echo.echo.domain.space.dto.SpaceResponseDto;
import com.echo.echo.domain.space.entity.Space;
import com.echo.echo.domain.space.repository.SpaceRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RequiredArgsConstructor
@Service
public class SpaceService {
private final SpaceRepository spaceRepository;
public Mono<SpaceResponseDto> createSpace(SpaceRequestDto requestDto) {
Space space = Space.builder()
.spaceName(requestDto.getSpaceName())
.isPublic(requestDto.getIsPublic())
.thumbnail(requestDto.getThumbnail())
.build();
return spaceRepository.save(space)
.map(this::toResponseDto);
}
public Mono<SpaceResponseDto> updateSpace(Long spaceId, SpaceRequestDto requestDto) {
return spaceRepository.findById(spaceId)
.flatMap(existingSpace -> {
Space updatedSpace = existingSpace.update(
requestDto.getSpaceName(),
requestDto.getIsPublic(),
requestDto.getThumbnail()
);
return spaceRepository.save(updatedSpace)
.map(this::toResponseDto);
});
}
public Flux<SpaceResponseDto> getAllPublicSpaces() {
return spaceRepository.findAll()
.filter(space -> "Y".equals(space.getIsPublic()))
.map(this::toResponseDto);
}
public Mono<SpaceResponseDto> getSpaceById(Long spaceId) {
return spaceRepository.findById(spaceId)
.map(this::toResponseDto);
}
public Mono<Void> deleteSpace(Long spaceId) {
return spaceRepository.deleteById(spaceId);
}
private SpaceResponseDto toResponseDto(Space space) {
return SpaceResponseDto.builder()
.id(space.getId())
.spaceName(space.getSpaceName())
.isPublic(space.getIsPublic())
.thumbnail(space.getThumbnail())
.uuid(space.getUuid())
.build();
}
}
package com.echo.echo.domain.space.entity;
import com.echo.echo.common.TimeStamp;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.util.UUID;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "space")
public class Space extends TimeStamp {
@Id
private Long id;
private String spaceName;
private String isPublic;
private byte[] thumbnail;
private String uuid;
@Builder
public Space(Long id, String spaceName, String isPublic, byte[] thumbnail, String uuid) {
this.id = id;
this.spaceName = spaceName;
this.isPublic = isPublic;
this.thumbnail = thumbnail;
this.uuid = uuid != null ? uuid : UUID.randomUUID().toString();
}
public Space update(String spaceName, String isPublic, byte[] thumbnail) {
return Space.builder()
.id(this.id)
.spaceName(spaceName)
.isPublic(isPublic)
.thumbnail(thumbnail)
.uuid(this.uuid)
.build();
}
}
자세한 내용: https://github.com/echo1241/echo/pull/17
pr에 테스트 결과까지 다 있다!
최종 프로젝트하면서 개인 공부도 하고 코테도 하루에 1개씩은 풀어야 되는데 그렇지 못하고 있다
노는 시간 줄이더라도 더 열심히 해야 될 거 같다 파이팅
'TIL' 카테고리의 다른 글
TIL - 2024/07/28 (0) | 2024.08.02 |
---|---|
TIL - 2024/07/27 (0) | 2024.07.31 |
TIL - 2024/07/19 (0) | 2024.07.19 |
TIL - 2024/07/12 (0) | 2024.07.12 |
TIL - 2024/07/08 (0) | 2024.07.08 |