2023 스프링 세미나 과제 레포
- 자바 17 설치 후 아래와 같이 버전 체크
➜ ~ java --version
java 17.0.6 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)
- 깃 클론 후 인텔리제이에서 실행
git clone https://github.com/wafflestudio/seminar-2023-springboot-assignment
- master 브랜치에서 서버 실행(Run 'SeminarApplication')
- 브라우저를 킨 후 http://localhost:8080 접속
- 치트 시트 활용하여 KotlinTest.kt 풀기
로그인을 위한 3개의 api를 구현해야 합니다. api 명세는 아래에서 확인할 수 있습니다.
-/src/test/kotlin/user/UserApi.http
POST http://localhost:8080/api/v1/signup
Content-Type: application/json
{
"username": "wafflestudio",
"password": "spring",
"image": "https://wafflestudio.com/images/icon_intro.svg"
}
...
회원가입, 로그인, 프로필 조회 기능에는 여러가지 조건이 존재합니다. 예를 들어, 회원가입 시 닉네임과 비밀번호는 최소 4자 이상이어야 합니다. 도메인 명세는 아래 테스트 파일에서 확인할 수 있습니다.
-/src/test/kotlin/user/UserServiceTest.kt
@Test
fun `유저 이름과 비밀번호는 4글자 이상이어야 한다`() {
assertThrows<SignUpBadUsernameException> {
...
}
...
}
UserService 인터페이스를 상속 받은 UserServiceImpl을 구현하여 UserServiceTest가 성공하도록 해야합니다.
-/src/main/kotlin/user/service/UserServiceImpl.kt
class UserServiceImpl(
private val userRepository: UserRepository,
) : UserService {
override fun signUp(username: String, password: String, image: String): User {
TODO()
}
...
}
회원가입, 로그인, 프로필 조회 API는 유저 요청에 따라 알맞은 http 응답을 내려줘야 합니다. 예를 들어, 회원가입 시 닉네임과 비밀번호가 최소 4자 이상이 아니면 400 Bad Request 응답을 내려줘야 합니다. API 명세는 아래 테스트 파일에서 확인 가능합니다.
-/src/test/kotlin/user/UserIntegrationTest.kt
@Test
fun `회원가입시에 유저 이름 혹은 비밀번호가 정해진 규칙에 맞지 않는 경우 400 응답을 내려준다`() {
mvc.perform(
post("/api/v1/signup")
...
)
...
}
현재 UserController가 아직 구현이 되지 않은 TODO() 상태입니다. UserController를 구현하여 UserIntegrationTest가 성공하도록 해야합니다.
-/src/main/kotlin/user/controller/UserController.kt
@RestController
class UserController(
private val userService: UserService,
) {
@PostMapping("/api/v1/signup")
fun signup(
@RequestBody request: SignUpRequest,
): ResponseEntity<Unit> {
TODO()
}
...
}
ExceptionHandler와 HandlerMethodArgumentResolver를 사용하여 UserController를 조금 더 간결하게 만들 수 있습니다. UserController2의 함수 인자와 리턴 타입이 달라진 것을 주목하여 추가 과제를 수행해주세요.
@RestController
class UserController(
private val userService: UserService,
) {
@GetMapping("/api/v1/users/me")
fun me(
@RequestHeader(name = "Authorization", required = false) authorizationHeader: String?,
): ResponseEntity<UserMeResponse> {
TODO()
}
}
@RestController
class UserControllerV2(
private val userService: UserService,
) {
@GetMapping("/api/v2/users/me")
fun me(user: User): UserMeResponse {
TODO()
}
}
-/src/test/kotlin/user/UserIntegrationTest2.kt가 통과하도록 구현하면 됩니다.