오늘의 목표 : 1 ~ 4 에 대한 목표를 구현하여 REST API 개발 을 마무리 지어보자.
1. 하드코딩 되어있던 문자열을 외부설정으로 분리하고,
2. 지금까지 구현한 Event API 를 정검하며 누락된 요구사항을 추가
3. Event 조회 시 수정 할 수 있는 정보를 제공해야하는데 수정할 수 있는 권한은 해당 사용자가 해당 Event 를 추가한 manager 인지 확인해야 하기 때문에 현재 사용자를 조회하는 로직이 필요
4. 조회 시 해당 사용자정보를 제공하는데 사용자 정보 제공 시 id, password와 같은 중요한 정보가 제공되기 때문에 Json 변환 시 출력 값을 제한이 필요.
오늘의 목차 :
1. 하드코딩 되어있던 문자열을 외부설정으로 분리
2. 이벤트 API 점검
3. 현재 사용자 조회
4. 출력값 제한하기
1. 하드코딩 되어있던 문자열을 외부설정으로 분리
@ConfigurationProperties 를 사용하여 하드코딩되어있던 문자열을 properties 로 빼기위해 의존성 주업이 필요하다.

@ConfigurationProperties(prefix = "my-app") 을 사용하여 properties 로 사용할값들을 선언 해준다.

application.properties에 아래와 같이 선언 할 수 있다.

AppConfig 수정
기존

수정

이제 java 소스단에서도 AppProperties 를 주입 받으면 application.properties에서 선언 한 정보를 꺼내서 사용할 수 있다.
AuthServerConfig 수정
기존

수정

2. 이벤트 API 점검
엑세스 토큰발급

Authorization type 을 Basic Auth로 설정하고 client-id, client-secret를 입력해준다.

Body 에 username,password, grant_type 정보를 입력하여 요청하면 access_type이 bearer 인 access_token 정보를 받을 수있다.

엑세스 토큰갱신

Authorization type 을 Basic Auth로 설정하고 client-id, client-secret를 입력해준다.

Body 에 grant_type에 refresh_token, refresh_token에 엑세스 토큰발급받을 때 같이 발급받았던 refresh_token에 정보를 입력하여 요청하면 access_type이 bearer 인 access_token 정보를 받을 수있다.

API root 요청(API가 제공하는 resource 정보를 볼 수 있다.)

Event 목록 조회
권한이 없더라도 목록조회는 가능

로그인후 Event 목록 조회를 하게된다면 Event 생성 링크 제공하도록 기능 추가해야함
Event 생성
권한추가 없이 Event 생성 요청을 하게되면 unauthorized 에러가 발생한다.

Bearer Token 추가 후 Event 생성 요청을 하게 되면 Event 가 정상적으로 생성 된 것을 확인할 수 있다.

Event 생성 응답 예시 (수정할 수있는 link 정보도 추가도 제공된다.)
{
"id": 33,
"name": "Spring",
"description": "REST API Development with Spring",
"beginEnrollmentDateTime": "2024-03-23T14:21:00",
"closeEnrollmentDateTime": "2024-03-24T14:21:00",
"beginEventDateTime": "2024-03-25T14:21:00",
"endEventDateTime": "2024-03-26T14:21:00",
"location": "강남역 D2 스타텁 팩토리",
"basePrice": 100,
"maxPrice": 200,
"limitOfEnrollment": 100,
"offline": true,
"free": false,
"eventStatus": "DRAFT",
"manger": null,
"_links": {
"self": {
"href": "http://localhost:8080/api/events/33"
},
"query-events": {
"href": "http://localhost:8080/api/events"
},
"update-event": {
"href": "http://localhost:8080/api/events/33"
},
"profile": {
"href": "/docs/index.html#resources-events-create"
}
}
}
Event 조회
로그인 없이 Event 조회

로그인 했을 때 로그인 사용자가 Event Manager 인 경우에 Event 수정할 수 있는 link를 제공해야한다.
3. 현재 사용자 조회
SecurityContext 는 자바 ThreadLocal 기반 구현으로 인증 정보를 담고 있어 아래와 같은 방법으로 인증정보를 꺼내올 수 있다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
우선 목록조회 시 로그인 정보가 있다면 create-event 에 대한 link 정보가 있기를 바라도록 Test 작성

EventController 수정

@AuthenticationPrincipal 어노테이션을 사용하여
- 인증 안한 경우에 null
- 인증 한 경우에는 username과 authorities 참조 가능하다.
AccountService 수정
목록조회 시 create-event에 대한 link 정보는 쉽게 제공할 수 있지만, Event 를 생성할 때 event manager 에 대한 정보를 추가하거나, update 시 해당 사용자가 manager인지를 확인할 때는 UserDetailsService를 구현한 AccountService 에서 User를 반환하는 부분을 Account 로 변경해주어야한다.
AccountAdapter 구현

User를 상속받아 AccountService에서 User를 반환하는 것이 아닌 구현한 AccountAdapter를 반환하여 Account 를 반환할 수 있도록 한다.
AccountService의 UserDetails 반환을 AccountAdapter로 변경

CurrentUser 어노테이션 구현

현재 인증 정보가 anonymousUse 인 경우에는 null을 보내고 아니면 “account”를 꺼내준다.
EventController 수정(CurrentUser 적용)

작성한 테스트가 통화가는 것을 볼 수 있다.

EventController 수정(createEvent, getEvent, updateEvent)
1) createEvent

currentUser를 받아서 event에 manager 정보 저장.
2) getEvent

currentUser를 받아서 만약 현재사용자가 event의 manager 와 같다면 update-event link 제공
3) updateEvent

currentUser를 받아서 현재사용자가 event의 manager 와 같지 않다면 HttpStatus.UNAUTHORIZED 반환한다.
4. 출력값 제한하기
Event 조회 시 우리는 manager 정보를 반환할 때 반환하면 안되는 값들도 반환하고있다.

출력되는 Manager 값을 id 로만 제한하자
AccountSerializer 추가

Event Entity 수정

@JsonSerialize 어노테이션을 사용하여 Json 으로 변환 시 출력값을 제한한다.
다음과 같이 출력값이 제한된 것을 볼 수 있다.
