Spring Framework 46

[SpringBoot] X-AUTH-TOKEN 으로 보내지 않을 경우 JWT 로직은 에러가 난다.

어제 안드로이드 쪽을 맡고 있는 친구랑 API 요청을 맞춰보던 중에 자꾸 UserDetails 로 String conversion 이 일어나지 못했다는 classcast Exception 이 발생했다. 이상하다 싶었다. 분명 내가 postman 에서 테스트할때는 전혀 문제 없었는데 친구가 안드로이드쪽에서 요청을 보낼때만 에러가 발생했다. 그리고 그 근본 발생지도 시큐리티 코어쪽에서 로그가 찍혀있어서 잔뜩 겁을 먹고 있었다. (시큐리티 코어를 아직 잘 모른다. 아니 사실 거의 모른다... ) 이것 저것 해보다가 도저히 해결이 안되서 그냥 모든 지점마다 Breakpoint 마냥 전부다 Print 로 찍어보면서 정확히 어디가 문제인지 전부 찍어봤는데 확실히 문제가 되는 지점을 찾았고 거기서 뭔가 이상한 점을 ..

[SpringBoot] Swagger 사용할때 반드시 주의할 점!! - @ApiModel 의 value는 겹치면 안된다.

오늘 모처럼 빨간날이라 쉬던 와중에 같은 팀원으로부터 api 에 전달해야할 정보가 뭔가 이상하다는 카톡을 받았다. 급히 swagger api spec 에 접속해서 확인해보니 정말 뭔가 이상했다. api 명세를 보니 Dto 객체를 전달받아서 그 Dto 를 통해서 이것저것 작업을 수행해줘야 하는데 어째 api spec 에 명시된 필드들이 Dto에 있는 필드들보다 더 많은 필드들이 존재했다. 이 Dto에서는 이런 필드를 정의해준적이 없는데 어디서 나온 필드들일까? 하고 생각했다. 그런데 그 필드들은 어디선가 많이 본듯한 필드인 것을 직감했다. 먼저 결론부터 말하겠다. Swagger 어노테이션을 사용하면서 @ApiModel 라는 어노테이션에 해당 네임을 적어주는 기능이 존재한다. 그런데 만약 다른 도메인 객체 ..

[Springboot & Intellij] 9.png 나인패치 이미지란? 9Patch image

springboot 어플리케이션을 작성 중에 신기한 걸 발견했다. 이미지들이 레포에 올라가지 않게 하기 위해서 gitignore에 이미지형식을 적어주고 있었는데 png 를 작성할때마다 자꾸 9.png 라는 양식으로 자동완성이 되었다. 그런데 9.png ? 들어본적도 없고 이런 이름을 자동완성을 시켜준다는게 상당히 이상하게 느껴졌다. 다른 의미있는 이름으로 자동완성시켜준다면 어디선가 쓰겠거니 하겠는데 9.png 라고 하는 의미없는 네이밍이 신기하게 느껴졌다. 그래서 검색해보니 아마 이게 맞을지는 모르겠지만 안드로이드에서 사용하는 나인패치 이미지와 연관성이 있을것이라고 결론내렸다. 이외에는 9.png 와 관련된게 딱히 없었다. (검색창에 springboot 나인패치 이미지 or springboot 9.png..

[springboot]cannot deserialize from Object value (no delegate- or property-based Creator) 에러 발생

스프링 부트로 만든 어플리케이션을 테스트하던 도중에 cannot deserialize from Object value (no delegate- or property-based Creator) 라는 에러를 만났다. api 를 호출하면서 어떤 Dto를 전달해주는데 그 사이에서 형식이 맞지 않았던 혹은 전달이 잘못되었든 어딘가에 문제가 생겼을 것이라고 추측하였다. 해결방법은 아주 간단하다. 아래는 내가 api로 전달하고자 했던 Dto 이다. (해결한 모습이다.) 위와 같이 Dto를 선언해줌으로써 해결할 수 있었다. 원래 해결되기 이전에는 @NoArgsConstructor 어노테이션이 없었다. 왜 이 어노테이션이 없으면 에러가 발생할까? jackson library가 빈 생성자가 없는 모델을 생성할 줄 모르기 ..

[JPA사용중] TransactionRequiredException: Executing an update/delete query 에러 발생/ 트랜잭션이란?

굉장히 간단한 에러이다. 근데 로직이 틀린게 아닌데 왜 에러가 날까 싶을거다. update나 delete 구문을 실행할때 @Transactional 어노테이션을 달아주지 않으면 발생하게 되는 에러이다. 이렇게 @Transactional 을 달아주면 에러가 나지 않는다. @Transactional 이 하는 기능도 굉장히 직관적인데 디비를 공부했다면 트랜잭션이 무엇인지 알것이다. 기억을 더듬어보자. @Transactional 은 이 어노테이션이 붙은 메서드의 경우 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다는 뜻이다. 전체 작업을 취소한다? 데이터베이스를 배웠다면 기억이 날텐데, 우리가 B라는 사람에게 돈을 보냈는데 갑자기 중간에 은행이 번개를 맞아서(ㅋㅋ) 실제로 내가 보낸..

[SpringBoot] 퍼블릭 IPv4 주소로 ec2에 연결시 connection timed out 발생할 경우

가끔 만들어놓은 ec2에 스프링부트를 띄워놓고 퍼블릭 ipv4 주소로 접근해서 잘 뜨는지 확인하려고 할경우 아무리 접속해도 connection timed out 이 발생하는 경우가 있다. 스프링부트 어플리케이션은 잘만 돌아가고 있는데도 왜 이렇게 접속이 안되는걸까? 성급하게 ec2를 만들고 빨리 테스트해보고 싶어서 이것저것 놓치면 발생하는 문제다. 보안 그룹에서 인바운드 규칙에 8080포트를 안열어놨을 가능성이 크다. SSH 연결하려고 22포트만 열어놓고 RDS 연결한다고 3306만 열어놓고 나머진 열어놓지 않아서 발생하는 문제이다. 꼼꼼히 살피고 HTTP, HTTPS, 혹은 8080포트를 열어놓자. https://bcp0109.tistory.com/356 AWS 1편: EC2 생성 후 Spring Bo..

[SpringBoot] hikaripool-1-Starting... stuck 문제 - hikaripool 에서 멈출 경우 대응방법

새롭게 진행하는 프로젝트에서 ec2를 만들어서 rds랑 연결하는 작업을 하고 있는데 스프링 부트 어플리케이션을 실행하면 hikaripool starting... 에서 무한정 대기하는 현상을 발견했다. 로컬에서 rds 에 연결했을때도 잘 연결됬는데 ec2 상에서 문제가 발생하는 것을 보고 인터넷을 한참 뒤졌다. 관련된 자료로는 hikari의 경우 특정 버전, 예를 들면 window 와 특정 oracle jdk 버전(18>이후)에서 고질적인 문제를 겪는다고 한다. 관련된 github 이슈가 딱 하나 있었는데 대화가 상당히 진행되며 이야기한 것의 요약을 해보면 위 환경에서 이유없이 그냥 stuck 되는 경우가 있었다고 한다. (이것때문에 고민하신 분들이 꽤 많았다. 하지만 내 문제와는 살짝 결이 다른 이슈인것..

[SpringBoot] SSH 접속 오류 : WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! + IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

오늘 잠시 운영중인 EC2에 문제가 생겨서 프론트 개발팀으로부터 확인해달라는 요청을 받았다. 나와 같이 백엔드를 맡고 계신분께서 ec2를 새로 파셨는데도 안된다는 연락을 받아서 나도 확인해보기 위해 새롭게 만들어진 ec2에 접근하려고 ssh설정을 만져주고 있었다. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eave..

[SpringBoot] no main manifest attribute in 에러

별다른 에러는 아니다. ./gradlew build를 통해 빌드를 해주면 jar파일이 생길텐데 이때 실행할적에 java -jar 파일명.jar 를 해주게 된다. 그런데 이때 build를 통해서는 두개의 jar 파일이 생성된다는 것을 알 것이다. 이때 바로 파일명-plain.jar 와 함께 파일명.jar 두개의 파일이 생성될 것이다. 여기서 plain 이 들어간 jar 파일은 의존성을 모두 빼고 딱 프로젝트에 있는 것들로만 jar파일을 만들었다고 보면 된다. 그래서 manifest.mf에 메인 메소드의 위치가 나오지 않는 것이다. 그러니 그냥 plain이 들어간 jar 말고 다른걸 실행해주자. 근데 매번 plain이 생성되는게 귀찮다면? build.gradle에 아래 구문을 추가해주면 된다. jar { e..

[SpringBoot] 백엔드 프로젝트 중간점검

프로젝트가 거의 막바지에 달했다. 사실 아직 부족한 기능도 너무 많고 완벽하게 테스트도 이뤄지지 않은 부분이 많다고 생각했다. 뭐 그래도 마감일이 있으니 결과물은 내놔야하기에 이것저것 손보며 뚝딱뚝딱하고 있다. 같은 파트를 맡은 팀원분께서 개인 사정으로 너무 바쁘셔서 거의 참여를 하지 못하셔서 얼추 4주 정도를 혼자 작업한 것 같다. (사실 작업하면서 중간에 고비가 몇번 있어서 정말 힘들긴했다. 초반에 같은 파트 팀원 한분께서 갑작스레 못한다고 하셔서 나가시게 되었고 다른 파트에서도 또 한분이 나가시면서 전체적으로 인원이 줄어든 점도 있지만 이 부분에선 크게 힘든점을 느끼진 못했다. 그저 좋은 기회를 함께 하지 못한 것이 아쉬웠을 뿐이다. 그보다는 팀원분들과 연락이 잘 안되는면에서 답답한 부분이 있었던 ..

[SpringBoot] @RestController와 ResponseEntity

스프링부트로 진행중인 프로젝트에서 한참 리팩토링을 진행중이었는데 @RestController 를 사용하면 컨트롤러마다 @ResponseBody를 반복할 필요가 없다고 한다. 왜냐면 이미 @RestController 내에 선언되어 있기 때문이다. 그래서 @RestController로 바꾸어 주기로 했다. 그런데 보통 @RestController를 사용할 경우에 ResponseEntity를 사용하는 경우가 많다고 한다. 그래서 리턴 타입도 모두 ResponseEntity로 바꾸어 주었다. 예전에는 객체나 문자열 혹은 Long타입 변수를 그대로 프론트에게 던졌는데 지금은 ResponseEntity로 주다보니 통일된 느낌이라 좋은 것같다. 그리고 에러가 발생했을 경우 그 또한 통일되게 처리할 수 있는 방법이 장..

[SpringBoot] *.jar 백그라운드 실행하기 - $ nohup 명령어 &

springboot로 프로젝트를 진행하는 와중에 운영 서버에서 .jar 을 실행시켜놓으려고 하는데 백그라운드 실행을 시키기 위해서는 nohup 커맨드를 입력해야 한다. 평소에 실행시킬 때는 java -jar blabla-0.0.1-SNAPSHOT.jar 와 같이 실행했겠지만 백그라운드에서 실행시키기 위해서는 아래와 같이 명령어를 치면 된다. & 이 백그라운드라는 의미이다. nohup java -jar blabla-0.0.1-SNAPSHOT.jar & 즉 이 명령어를 치면 터미널 세션이 끊어져도 계속 실행된다. 이 명령어를 치면 nohup.out 파일이 생기는데 이 파일에 해당 jar파일의 출력들이 저장된다고 보면 된다. 실제로 위의 명령어들을 실행한 뒤에 ps -al을 실행해보면 아래와 같이 잘 실행하고..

java.lang.IllegalStateException: Ambiguous handler methods mapped for '/favicon.ico':

illegalStaeException 은 여러번 본적이 있지만 /favicon.ico는 뭘까? 배포중에 문제가 생겨 다시 로컬에서 부트를 띄우던 도중에 갑자기 위와 같은 에러가 발생했다. 사실 이전에 restapi 들의 경로를 바꿔주었던 작업에서 계속 작은 문제들이 잇따라 발생했는데 혹시 거기서 또 뭔가 발생하지 않았나 짐작하긴했었다. 결론부터 말하면 맞다. Controller의 경로가 중복되었을때 발생하는 고질적인 문제이다. 꼭 경로가 중복된 상황에서만 발생하는게 아니라 이외의 상황에서도 발생할 수 있는 에러이긴 하다. 그런데 신기한 점은 Ambiguous하다는 로그에 있다. 왜 모호하다는 표현을 썼을까? 위의 두 사진을 보면 api의 mapping에서 한군데는 filename이라고 되어있고 한군데는 ..

[SpringBoot] @PathVariable vs @RequestParam

둘 중 뭐가 더 나은지는 사실 성능상 상관없다. 상황에 따라 더 좋은 것을 쓰면 되는데 아주 미묘한 차이가 있다. (사실 이전까지는 뭐 별반 차이없을거라 생각해서 그냥 무작정 @RequestParam 만 잔뜩 써대고 있었다. ) 1. @ParhVariable은 어떠한 Resource를 식별하고 싶다고 하면 그때 사용하면 되는 것이고 2. @RequestParam은 정렬이나 필터링을 할때 사용하면 좋다. 즉 2번의 예시를 들자면 url에 파라미터로 특정 조건에 충족하는 사람만 조회해서 가져오고 싶다면 다음과 같이 쓰면 된다. localhost:8080/test/condition=good 이런 식으로 컨디션이 좋은 사람들만 골라서 가져오겠다는 식으로 말이다. 이럴때 @RequestParam을 쓰면 좋다. 이..

[SpringBoot] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL

프로젝트를 수정하는 도중 새로운 jpa 엔티티를 추가해서 진행하고 있었는데 ddl-auto: create으로 테이블을 생성해보니 org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL 이라는 에러가 발생했다. 분명 h2 디비도 잘 돌아가고 있었는데 왜 ddl 구문에서 에러가 발생했을까? 원인은 예약어에 있었다. 밑에 사진을 보면 컬럼 중에 like 라는 컬럼이 있다. 즉 like 는 이미 mysql에 존재하는 예약어이다. 즉 이 컬럼명을 likes로 바꾸던지 prefer로 바꾸던지 해서 문제를 해결하는 것이 좋다. 즉 프로그래밍 언어에서 int를 변수명으로 선언하는 것과 비슷한 경우랄까? 혹은 assert 를 변수명으로 ..

[SpringBoot] java.nio.file.NoSuchFileException tomcat에러

흔히 발생할 수 있는 에러인데 이번엔 좀 특이한 상황에서 발생해서 기록해두게 되었다. 프로젝트를 진행하면서 게시판에 글을 작성했을때 사진도 여러장 첨부할 수 있도록 만들고 있었다. MultipartFile을 List로 묶어서 다루고 있었는데 잘 작동하는지 확인해보기 위해서 컨트롤러에 사진과 글을 전달하고 사진을 다시 프론트에서 던져주는 방식으로 작성하였다. List이 return 되는 셈이었다. 아마 사진이 찍히는게 아니라 toString() 처럼 명세라던지 아니면 path라던지 어찌되었든 뭐가됬든 뭐라도 찍히는지 확인해보고자 리턴했는데 위와 같은 java.nio.file.NoSuchFileException 에러가 발생했다. 그리고 에러 로그를 읽어보면 정말 흥미로운 내용이 있다. 에러 사유에 tomca..

[SpringBoot] io.jsonwebtoken.security.WeakKeyException: The signing key's size is 80 bits which is not secure enough for the HS512 algorithm.

jwt 를 만들려고 하고 있는데 에러가 발생했다. 키 사이즈가 작다고 해서 단지 그저 키로 주어준 문자열이 너무 짧아서 이런 에러를 낸다고? 라고 생각했는데 정말 그게 맞다. 해쉬 알고리즘으로 바꿀때 키도 같이 주게 되는데 그냥 길이를 좀 늘려주면 해결된다. 단순한 에러였다. 아래 블로그에서 좀 더 상세한 내용을 살필 수 있다. https://lemontia.tistory.com/1021 [springboot, jwt] jwt 로 토큰 생성, 유효시간 관리 하기 이번에는 jwt를 이용한 로그인 인증을 만들려 한다. 일전에 @EnableAuthorizationserver deprecated 되면서 찾던 중 jwt가 있어 이걸 활용하기로 했다(DB로 토큰유효성 확인도 안해서 더 나은거 같기도 하고 lemon..

[SpringBoot] Error resolving template [/index]

springboot 를 통해 작업을 마치고 무사히 build까지 끝났는데 막상 구동을 하고 localhost:8080 에 들어갔더니 제목과 같은 에러가 뜨면서 갑자기 에러로그가 찍히는걸 확인할 수 있다. 정말 간단한 이유인데 만약 작성한 컨트롤러 중에서 return "/index"; 이처럼 슬래쉬 / 를 붙여서 작성해준 컨트롤러가 있다면 슬래쉬를 제거하고 return "index"; 와 같이 작성해주면 된다. (이때 index.html 이 있다고 가정하는 상황이다.) 어느 블로그를 살펴보니 슬래쉬 때문에 경로를 찾지 못해 발생하는 상황이라고 한다. 슬래쉬를 빼버리면 된다. 아래 블로그를 참조하면 여기보다 더 친절하게 설명되어있다. https://dev-jwblog.tistory.com/40 [Spring..

[SpringBoot] Springboot kakao OAuth 구현 참고 블로그

https://linkeverything.github.io/springboot/kakao-login-3/ 카카오톡 로그인 구현하기 - (3) OAuth 방식 구현하기 웹이든 앱이든 서비스를 개발하는 데 있어서 SSO(Single Sign On) 의 필요성이 계속 화두가 되는 것 같습니다. 이제 기존 시스템 이라는 것이 거의 다 있게 마련이고, 따라서 기존에 사용하던 로그인 linkeverything.github.io 위 블로그에서 많은 도움을 받았다.

[SpringBoot] 로컬 Git -> AWS EC2까지 서버에서 jar를 실행해보자.

3주 전부터 친구들과 작은 게임을 만들고 있었는데 회원가입 + 로그인 + 점수 + 랭킹을 제공하는 API를 만드는 일을 맡았다. springboot + jpa + mysql을 사용하여 만들고 있어서 내가 서버를 맡고 나머지 두명이 안드로이드와 IOS를 맡았다. 얼마 시간이 지나지 않았지만 워낙 내용이 간단한 게임이라 완성이 되었는데 AWS와 깃을 쓰면서 기억해주면 좋은 내용이 있어서 포스팅하게 되었다. 우선 코드가 모두 다 작성된 상태에서 출발한다. 우선 인텔리제이에서 springboot과 jpa를 사용하여 작성한 프로젝트가 있는 폴더를 깃에 업로드해주면 된다. git config --global user.name git config --global user.email 을 해주고 해당 리포지토리에서 ur..

반응형