개발/Spring

[Spring] Slack Slash Command - 5

hojak99 2019. 10. 7. 23:03

이번 글에서는 코드로 살펴보도록 하겠습니다. 


 

■ data payload

SlashCommandRequest
SlashCommand controller method

 

data payload 를 사용해야 하기 때문에 저는 객체에 매핑이 되도록 해주었습니다. 여기서 놓치지 말아야 할 부분은 slack 에서는 data payload 을 보낼 땐 Content-type header 를 application/x-www-form-urlencoded 로 설정해서 보냅니다.

그렇기 때문에 위 사진처럼 @RequestBody 를 사용하지 않습니다. 자세한 사항은 아래 링크를 참고해주시면 감사하겠습니다. 이렇게 개발을 함으로 써 따로 converter 를 만들지 않아도 쉽고 빠르게 개발을 할 수 있게 됩니다.

그리고 저는 Lombok 을 주로 사용해서 개발을 하는데 이 때 매핑할 클래스에 각 필드에 대한 setter 가 존재하지 않으면 매핑되지 않습니다. 

@RequestBody 를 통해 매핑을 받을 때는 setter 를 생성하지 않아도 매핑을 해주나 Content-type 에 header 가 application-x-www-form-urlencoded 로 설정 돼 있을 땐 내부적으로 setter 를 사용하는 듯합니다. 자세히 알아보진 않았으나 추후 알아보려고 합니다.

https://stackoverflow.com/questions/34782025/http-post-request-with-content-type-application-x-www-form-urlencoded-not-workin/38252762

 

Http Post request with content type application/x-www-form-urlencoded not working in Spring

Am new to spring currently am trying to do HTTP POST request application/x-www-form-url encoded but when i keep this in my headers then spring not recognizing it and saying 415 Unsupported Media Ty...

stackoverflow.com

이제 다시 테스트 시 정상적으로 각 필드에 대한 데이터가 정상적으로 출력되는 것을 확인하실 수 있습니다.


 

■ Hmac 알고리즘을 통한 요청 인증

이제 서버로 들어온 요청이 슬랙에서 보낸 유효한 요청인지, 유효하지 않은 요청인지 체크하는 인터셉터를 만들어주려고 합니다. 전 글에서 작성했던 것처럼 아래와 같은 과정으로 요청이 유효한지 검사를 하려고 합니다. 

 

인증 처리 과정

 

자세한 내용은 아래 전 글을 참고해주세요. (https://hojak99.tistory.com/556)

 

패키지 구조

 

우선 다음과 같은 패키지를 구조를 가지도록 하였습니다. 여기서 SecurityInterceptorSlackSecurityService 를 분리를 시켜주었는데 단순히 코드를 분리하고 싶어서 입니다.

이렇게 되면 추후에 개발이 완료될 때 SecurityInterceptor 에서는 SlackSecurityService 의 메소드를 단순히 호출하는 식으로 해서 최대한 비지니스 로직을 분리해서 사용할 수 있도록 될 것입니다.
(우선 인증검사 로직을 비지니스 로직이라고 생각을 했습니다. 어느 레이어에 두어야할 지 고민이 되는데 우선 service 패키지 내에 존재하도록 했습니다. )


자세한 사항은 코드 상으로 보시는 것이 더 이해하기 쉬우실 것 같아 아래 깃허브에서 확인해주시면 감사하겠습니다.

https://github.com/hojak99/slack-slash-command

 

hojak99/slack-slash-command

slack slash command security example. Contribute to hojak99/slack-slash-command development by creating an account on GitHub.

github.com

 

반응형