Skip to content

Commit 7166cb5

Browse files
authored
Merge pull request #18 from EntryDSM/feature/12-layerd-to-hexagonal-screen
Feature/12 layerd to hexagonal screen
2 parents 08fefd3 + 8bb1e99 commit 7166cb5

17 files changed

Lines changed: 453 additions & 0 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package hs.kr.entrydsm.feed.adapter.`in`.screen
2+
3+
import hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response.QueryScreenResponse
4+
import hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response.ScreenResponse
5+
import hs.kr.entrydsm.feed.application.screen.port.`in`.CreateScreenUseCase
6+
import hs.kr.entrydsm.feed.application.screen.port.`in`.QueryScreenUseCase
7+
import hs.kr.entrydsm.feed.application.screen.port.`in`.UpdateScreenUseCase
8+
import org.springframework.http.HttpStatus
9+
import org.springframework.web.bind.annotation.GetMapping
10+
import org.springframework.web.bind.annotation.PatchMapping
11+
import org.springframework.web.bind.annotation.PathVariable
12+
import org.springframework.web.bind.annotation.PostMapping
13+
import org.springframework.web.bind.annotation.RequestMapping
14+
import org.springframework.web.bind.annotation.RequestPart
15+
import org.springframework.web.bind.annotation.ResponseStatus
16+
import org.springframework.web.bind.annotation.RestController
17+
import org.springframework.web.multipart.MultipartFile
18+
import java.util.UUID
19+
20+
/**
21+
* 화면 정보 관련 HTTP 요청을 처리하는 웹 어댑터 클래스입니다.
22+
*
23+
* 이 클래스는 화면 정보와 관련된 모든 HTTP 엔드포인트를 제공하며,
24+
* 클라이언트의 요청을 적절한 서비스 메서드로 라우팅합니다.
25+
*
26+
* @property screenService 화면 정보 비즈니스 로직을 처리하는 서비스
27+
*/
28+
@RestController
29+
@RequestMapping("/screen")
30+
class ScreenWebAdapter(
31+
private val createScreenUseCase: CreateScreenUseCase,
32+
private val updateScreenUseCase: UpdateScreenUseCase,
33+
private val queryScreenUseCase: QueryScreenUseCase,
34+
) {
35+
/**
36+
* 새로운 화면 이미지를 업로드하고 저장합니다.
37+
*
38+
* @param image 업로드할 화면 이미지 파일
39+
* @return 업로드된 화면 이미지 정보가 포함된 응답 객체
40+
*/
41+
@ResponseStatus(value = HttpStatus.CREATED)
42+
@PostMapping
43+
suspend fun createScreen(
44+
@RequestPart(name = "image") image: MultipartFile,
45+
): ScreenResponse = createScreenUseCase.execute(image)
46+
47+
/**
48+
* 기존 화면 이미지를 새로운 이미지로 업데이트합니다.
49+
*
50+
* @param id 업데이트할 화면의 고유 식별자
51+
* @param image 새로운 화면 이미지 파일
52+
* @return 업데이트된 화면 이미지 정보가 포함된 응답 객체
53+
*/
54+
@PatchMapping("/{screen-id}")
55+
fun updateScreen(
56+
@PathVariable(name = "screen-id") id: UUID,
57+
@RequestPart(name = "image") image: MultipartFile,
58+
): ScreenResponse = updateScreenUseCase.execute(id, image)
59+
60+
/**
61+
* 모든 화면 이미지 목록을 조회합니다.
62+
*
63+
* @return 화면 이미지 목록이 포함된 응답 객체 리스트
64+
*/
65+
@GetMapping
66+
fun queryScreen(): List<QueryScreenResponse> = queryScreenUseCase.execute()
67+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response
2+
3+
import java.time.LocalDateTime
4+
import java.util.UUID
5+
6+
/**
7+
* 화면 정보 조회 응답을 위한 데이터 클래스입니다.
8+
* 화면의 상세 정보와 메타데이터를 클라이언트에 반환할 때 사용됩니다.
9+
*
10+
* @property id 화면 정보의 고유 식별자 (UUID)
11+
* @property image 화면에 표시될 이미지의 URL 또는 경로
12+
* @property createAt 화면 정보가 생성된 일시
13+
* @property modifyAt 화면 정보가 마지막으로 수정된 일시
14+
*/
15+
data class QueryScreenResponse(
16+
val id: UUID,
17+
val image: String,
18+
val createAt: LocalDateTime,
19+
val modifyAt: LocalDateTime,
20+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response
2+
3+
/**
4+
* 화면 정보 응답을 위한 데이터 클래스입니다.
5+
* 클라이언트에게 반환되는 화면 관련 정보를 담고 있습니다.
6+
*
7+
* @property image 화면에 표시될 이미지의 URL 또는 경로
8+
*/
9+
data class ScreenResponse(
10+
val image: String,
11+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package hs.kr.entrydsm.feed.adapter.out.entity.screen
2+
3+
import hs.kr.entrydsm.feed.global.entity.BaseEntity
4+
import jakarta.persistence.Column
5+
import jakarta.persistence.Entity
6+
import java.util.UUID
7+
8+
/**
9+
* 화면 정보를 데이터베이스에 저장하기 위한 JPA 엔티티 클래스입니다.
10+
*
11+
* @property image 화면에 표시될 이미지의 경로 또는 URL
12+
* @property adminId 화면을 등록한 관리자 ID (UUID)
13+
* @param id 엔티티의 고유 식별자 (생성 시 자동 생성됨)
14+
*/
15+
@Entity(name = "tbl_screen")
16+
class ScreenJpaEntity(
17+
id: UUID? = null,
18+
var image: String,
19+
@Column(columnDefinition = "BINARY(16)")
20+
val adminId: UUID,
21+
) : BaseEntity(id)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package hs.kr.entrydsm.feed.adapter.out.mapper.screen
2+
3+
import hs.kr.entrydsm.feed.adapter.out.entity.screen.ScreenJpaEntity
4+
import hs.kr.entrydsm.feed.model.screen.Screen
5+
import org.mapstruct.Mapper
6+
7+
/**
8+
* 화면(Screen) 도메인 모델과 JPA 엔티티 간의 변환을 담당하는 매퍼 인터페이스입니다.
9+
* MapStruct를 사용하여 구현체가 자동으로 생성됩니다.
10+
*/
11+
@Mapper(componentModel = "spring")
12+
interface ScreenMapper {
13+
/**
14+
* Screen 도메인 모델을 JPA 엔티티로 변환합니다.
15+
*
16+
* @param model 변환할 Screen 도메인 모델
17+
* @return 변환된 ScreenJpaEntity 인스턴스
18+
*/
19+
fun toEntity(model: Screen): ScreenJpaEntity
20+
21+
/**
22+
* JPA 엔티티를 Screen 도메인 모델로 변환합니다.
23+
*
24+
* @param entity 변환할 ScreenJpaEntity 인스턴스
25+
* @return 변환된 Screen 도메인 모델
26+
*/
27+
fun toModel(entity: ScreenJpaEntity): Screen
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package hs.kr.entrydsm.feed.adapter.out.persistence.screen
2+
3+
import hs.kr.entrydsm.feed.adapter.out.mapper.screen.ScreenMapper
4+
import hs.kr.entrydsm.feed.adapter.out.persistence.screen.repository.ScreenRepository
5+
import hs.kr.entrydsm.feed.application.screen.port.out.FindScreenPort
6+
import hs.kr.entrydsm.feed.application.screen.port.out.SaveScreenPort
7+
import hs.kr.entrydsm.feed.model.screen.Screen
8+
import org.springframework.data.repository.findByIdOrNull
9+
import org.springframework.stereotype.Component
10+
import java.util.UUID
11+
12+
/**
13+
* 화면 정보 도메인과 데이터베이스 간의 상호작용을 담당하는 어댑터 클래스입니다.
14+
*
15+
* @property screenRepository 화면 정보 엔티티를 데이터베이스에서 조작하기 위한 리포지토리
16+
* @property screenMapper 화면 정보 도메인 객체와 엔티티 간의 변환을 담당하는 매퍼
17+
*/
18+
@Component
19+
class ScreenPersistenceAdapter(
20+
private val screenRepository: ScreenRepository,
21+
private val screenMapper: ScreenMapper,
22+
) : SaveScreenPort, FindScreenPort {
23+
override fun saveScreen(screen: Screen) {
24+
screenRepository.save(screenMapper.toEntity(screen))
25+
}
26+
27+
override fun findAll(): List<Screen> {
28+
return screenRepository.findAll().map { screenMapper.toModel(it) }
29+
}
30+
31+
override fun findByIdOrNull(screenId: UUID): Screen? =
32+
screenRepository.findByIdOrNull(screenId)?.let {
33+
screenMapper.toModel(it)
34+
}
35+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package hs.kr.entrydsm.feed.adapter.out.persistence.screen.repository
2+
3+
import hs.kr.entrydsm.feed.adapter.out.entity.screen.ScreenJpaEntity
4+
import org.springframework.data.jpa.repository.JpaRepository
5+
import java.util.UUID
6+
7+
/**
8+
* 화면(Screen) 데이터에 접근하기 위한 JPA Repository 인터페이스입니다.
9+
* 화면 엔티티의 CRUD 작업을 위한 기본 메서드를 상속받아 사용합니다.
10+
*/
11+
interface ScreenRepository : JpaRepository<ScreenJpaEntity, UUID>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package hs.kr.entrydsm.feed.application.screen.exception
2+
3+
import hs.kr.entrydsm.feed.global.error.exception.CasperException
4+
import hs.kr.entrydsm.feed.global.error.exception.ErrorCode
5+
6+
/**
7+
* 화면 정보를 찾을 수 없을 때 발생하는 예외 클래스입니다.
8+
*
9+
* @property status HTTP 상태 코드 (404)
10+
* @property message 에러 메시지
11+
*/
12+
object ScreenNotFoundException : CasperException(
13+
ErrorCode.SCREEN_NOT_FOUND,
14+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package hs.kr.entrydsm.feed.application.screen.port.`in`
2+
3+
import hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response.ScreenResponse
4+
import org.springframework.web.multipart.MultipartFile
5+
6+
/**
7+
* 화면 생성을 위한 유스케이스 인터페이스입니다.
8+
* 화면 도메인에서 새로운 화면 이미지를 업로드하고 생성하는 역할을 담당합니다.
9+
*/
10+
interface CreateScreenUseCase {
11+
12+
suspend fun execute(file: MultipartFile): ScreenResponse
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package hs.kr.entrydsm.feed.application.screen.port.`in`
2+
3+
import hs.kr.entrydsm.feed.adapter.`in`.screen.dto.response.QueryScreenResponse
4+
5+
/**
6+
* 화면 목록 조회를 위한 유스케이스 인터페이스입니다.
7+
* 화면 도메인에서 모든 화면 목록을 조회하는 역할을 담당합니다.
8+
*/
9+
interface QueryScreenUseCase {
10+
/**
11+
* 모든 화면 목록을 조회합니다.
12+
*
13+
* @return 화면 목록 응답
14+
*/
15+
fun execute(): List<QueryScreenResponse>
16+
}

0 commit comments

Comments
 (0)