Spring boot 로 웹소켓 한 번 짜보려고 했는데 내가 aws에 올려놓은 db에 연결이 되지 않았다. 분명 며칠 전만 해도 DB 접속 개꿀짱짱 잘 됐었다.



[사진 1: 에러 로그]



com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure


다음과 같은 오류가 발생했지만, 분명 DB는 AWS 에서 정상적으로 작동하고 있었다. 사용자 문제인 줄 알았지만 stackoverflow 에서 Security Group ~ 어쩌구 하는거 보니까 Security Group 쪽을 수정하면 되는 것 같다. 








[사진 2: RDS 인스턴스]



분명 DB 인스턴스는 사용 가능한 상태이다. 







[사진 3: 인스턴스 보안그룹]



해당 보안그룹이 아마 처음에 default(~) 로 되어있을 것이다. 그래서 하나 새로 만들었다. 모든 아이피에서 접근할 수 있도록~






[사진 4: DB 보안그룹]




필자는 새로 보안그룹을 만들어줬기 때문에 저렇게 보이는 것이고 만약 default() 로 설정해놓았으면 해당 부분이 default(~) 로 되어있을 것이다. 클릭해서 설정창으로 들어가자.






[사진 5: 보안그룹생성]



보안그룹을 생성해야한다.





[사진 6: 보안그룹생성-2]



다음과 같이 [위치무관] 으로 설정한다. 참고로 필자는 mysql 을 사용하기 때문에 유형에서 [MYSQL/Aurora] 를 선택했다.




그리고 다시 인스턴스 수정창으로 가서 방금 생성한 보안그룹으로 설정해주면 해결된다. (설정하고 [즉시적용] 을 선택해주자)



끝~ 해결

블로그 이미지

hojak99

2017.08.01 취직~~~

Spring JPA 를 사용하면서 Pageable 이라는 것을 사용해보았는데 정말 편하다.


공식문서에 따르면 pageable 에서는 page, size, sort 라는 파라미터를 사용할 수 있다고 한다.


각 파라미터의 의미를 생각해보면 무척 쉽다.



@GetMapping("/board")
public List getAllBoard(Pageable pageable) throws Exception {
	return boardService.findAll(pageable);
}


다음과 같이 controller 메소드에 파라미터로 Pageable 인터페이스를 받고, 해당 url 에 접속할 때 


http://localhost:8080/board?size=3


와 같이 쿼리스트링으로 받으면 해당 사이즈만큼 리스트를 반환한다.


내부적인 구조는 이따 집가서 해보겠다.

블로그 이미지

hojak99

2017.08.01 취직~~~

우선 필자는 Spring WebFlux 에 reactive mongo 를 사용 중이었다. 그리고 UserRepository 라는 인터페이스에 ReactiveCrudRepository<> 클래스를 상속 받게 해놓았다.



package com.kjh.hojak.repository;

import com.kjh.hojak.model.User;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;

public interface UserRepository extends ReactiveCrudRepository <User, String> {

    Mono<User> findByWriter_id(Mono<String> writer_id);
}


위의 코드와 같이 writer_id 를 이용해 User 를 검색하는 메소드를 선언해놓았다.


그리고 해당 메소드를 handler 클래스에서 호출하는 식으로 코드를 작성했는데 다음과 같은 오류가 발생했다.


org.springframework.data.mapping.PropertyReferenceException: No property writer found for type User!


해당 오류를 보면 User 클래스에 writer 라는 프로퍼티를 찾을 수 없다고 한다. 분명 User 클래스에는 writer_id 라는 프로퍼티가 존재한다.


그래서 혹시 몰라서 User 클래스에서 _ (언더바)를 제외하고 writerId 로 프로퍼티 선언해주고 위의 UserRepository 인터페이스에서도 findByWriterId(Mono<String> writerId) 로 메소드를 선언해주니 오류가 해결됐다.


package com.kjh.hojak.repository;

import com.kjh.hojak.model.User;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;

public interface UserRepository extends ReactiveCrudRepository<User, String> {

    /**
     * WriterId 로 User 찾는 메소드. (언더바는 인식 못 하는 것 같음.)
     * @param writerId
     * @return
     */
    Mono<User> findByWriterId(Mono<String> writerId);
}


후,,

블로그 이미지

hojak99

2017.08.01 취직~~~

Spring WebFlux 에 Swagger 를 적용해보려고 했는데 깃허브에 Springfox 프로젝트에 issue 를 보니까 지원을 하지 않는 것 같다. 물론 Spring 5도!



참조 링크 : https://github.com/springfox/springfox/issues/1773/


해당 이슈에 마지막 쯤에 이런 코멘트가 달려있다.


Recap:

  • Sping 5 (spring-data-rest 3) dropped support for Javas older that Java 1.8.
  • Spingfox projects are written and compiled in Java 1.6 (WTF?)
  • Springfox can not support Webflux or spring-data-rest at all without Springfox rewriting the the whole project (or at least most of it) in Java 1.8
  • NoSuchMethodError: getRepositoryInformationFor is caused by this method having Optional<> parameters in Java1.8 and Springfox Java1.6 does not understand or support those.
  • I doubt Springfox will be able to fix this anytime soon. Unlikely that this would be fixed in lifetime of any project that you or I are currently doing using Spring5.


블로그 이미지

hojak99

2017.08.01 취직~~~