JPA, QueryDsl 쓰기 참 힘들다.

그래도 하나 하나 어렵게 해 나가고 있는데 오늘은 또 Group By한 Count 개수를 반환하는 것을 만든 삽질 내용을 올린다.


리파지토리 단 소스는 아래와 같다.




그리고 가지고 온 내용을 가지고 맵으로 이쁘게 정렬해서 반환해 주면 된다.




코드만 놓고 보자면 별거 아닌데, 모르는 상태에서 찾아서 할려니 진도가 더디다. ㅠㅠ




WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

WebSocket을 이용하여 특정 내용을 처리하는 로직을 개발 중에 삽질한 내용을 정리 차원에서 올린다.

클라이언트는 SockJS와 stompClient를 이용하였고, 서버는 Spring에서 기본적으로 정리한 내용을 크게 바꾸지 않은 상태로 코딩 하였다.

전반적으로 코드의 내용은 https://spring.io/guides/gs/messaging-stomp-websocket/ 에서 나오는 내용과 거의 다르지 않다.

다만 해당 내용을 코딩 중에 sockjs에서 websocket 서버의 "endpoint/info?timestamp" 와 같은 주소를 찾지 못하는 경우가 발생 했다.

이로 인해 서버의 특정 모듈 Dependency가 잘못 되던가, 알지 못하는 문제로 인해 발생 하는 것인줄 알고 프로젝트를 Spring Boot로 싹 다 새로 만들게 되었다.


스프링 부트로 만든 상태에서 테스트 해 보니 이상 없이 돌아 갔는데, 해당 내용을 실제 개발 플랫폼에 적용하려고 보니 다시 info 페이지가 404 에러를 내 뿜는게 아닌가 ㅠㅠ

https와 http 문제라고 생각해서 프로토콜도 맞추었지만 현상은 해결 되지 않았다.


그런데 크롬의 개발자 도구를 자세히 살펴 보니 info 호출 시 response에 "Invalid CORS request" 라고 response가 뜨는 것을 발견 ㅠㅠ

도메인 문제인 것 같은데...

그렇다면 서버에서 어떻게 설정을 해 주어야 다른 도메인에서도 접근 가능하도록 해 줄 수 있는것일까? 하고 다시 구글링 돌입...


결국 https://spring.io/guides/gs/messaging-stomp-websocket/#_configure_spring_for_stomp_messaging 부분에서 보이는 것 처럼 endpoint 설정 시 접근할 수 있는 도메인을 추가로 정해 주면 되는 것이었다.

내가 찾은 stackoverflow의 좌표는 https://stackoverflow.com/questions/30502943/spring-websocket-connecting-with-sockjs-to-a-different-domain


이전 코드

수정 된 코드



결국 setAllowedOrigins("*") 하나를 위해서 2주 정도 삽질을 하게 된 ㅠㅠ

물론 이것 뿐 아니라... 현재 웹 소켓에 동시 접속된 유저 수를 구하기 위해 프로젝트를 새롭게 구성할 필요가 있긴 했다.


동접자 구하는 소스는 참고로 아래와 같다.

다만... 공식적인 소스가 아니라 그냥 디버깅 해 가면서 만든 소스라서 정확하게 동작 안 할 수 도 있다.


Websocket Config 정의하는 Class 내에 아래와 같이 inbound interceptor를 정의 한다.



그리고 나서 인터셉터에서 세션을 Set에 담아 size를 구해와서 사용하면 된다.


WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글  2개가 달렸습니다.
  1. 비밀댓글입니다
    • boot랑 spring이랑 차이 없지 않나요?
      maven pom.xml에서 의존성만 설정하고 필요한 라이브러리만 가지고 오면 상관 없을 것으로 보입니다.

      다만 주의 하실 것은 위 내용처럼 도메인 크로스 체크 부분인 것으로 보입니다.

      설정 역시 예제 스프링 소스가 있는 링크에 다 있는 것으로 압니다. ^^
secret

구매후기 이미지 업로드에서 오류가 나고 있어서 해당 내용을 검토 중에 알게 된 내용을 정리합니다.

기본적으로 아래와 같은 방식으로 업로드가 되고 있습니다.


브라우저 -> php -> Java


그런데 문제는 어느 한쪽의 문제가 아니라 php, Java 둘다 문제가 발생...

그리고 문제의 원인은 둘다 Version Up이였습니다.


1. 먼저 Java

Error Message가 "Required MultipartFile parameter 'file' is not present" 라고 발생.

구글링 하니 http://stackoverflow.com/questions/25830503/spring-mvc-http-status-400-required-multipartfile-parameter-file-is-not-pre 가 검색 됨.


아래와 같은 방식으로 수정


AS-IS : <bean id="multipartResolver" class="**org.springframework.web.multipart.commons.CommonsMultipartResolver**" />

TO-BE : <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />


2. 다음으로 PHP


PHP에서 Java 쪽으로 파일을 올릴 때는 CURL을 사용했는데 기존에 /tmp에 올라온 임시 파일을 읽어 들일 때는 @를 사용해서 리소스를 읽어 들였음.

php 5.5.0 기준 Deprecated 된 기능이라서 다른 방법으로 수정




WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Spring Batch를 그닦 많이 써본 경험이 없지만, 특정 요구 사항이 있어서 개발하게 되었습니다.

작업을 하면서 겪은 오류를 어떻게 해결 했는지 History 및 Backup을 위해 적어 둡니다.


보통 배치는 Reader와 Writer로 구분합니다.

특정 정보를 Reader에서 읽어 들여서 필요한 내용을 가공하고 Writer에서 필요한 행동을 합니다.


그런데 Reader에서 정보를 읽어 들이고 가공하는 시간이 오래 걸리면서 Writer에서 DB Connection을 못 찾게 되고, Writer 작업을 수행하지 못하게 되는 경우가 발생했습니다.


구글링을 한 결과 "autoReconnect 값을 true로 해라", "validationQuery를 날려라" 등등이 나왔지만 유효하지 않은 해결책이였습니다.


결국 찾아낸 해결 방법은 applicationContext.xml에서 database 관련 다음의 옵션을 수정하는 거였습니다.


testOnBorrow : true


이 옵션은 커넥션 풀에서 커넥션을 가져올 경우 유효한지 검사하는 것인데

일반적인 웹서비스에서는 커넥션이 자주 맺고 끊어져서 이 옵션과 상관없이 잘 동작 하는데

배치와 같이 특별한 경우에는 기존 커넥션을 사용하려다가 연결 해제된 커넥션을 검증 안하고 쓰면서 발생한 문제였습니다.

즉 testOnBorrow가 false인 경우에는 유효하지 않은 커넥션을 사용할 수 있으므로, Writer에서 에러가 종종 발생하게 된 것입니다.



WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret

다국어 사용을 위해서 그동안 Struts2 기반 MessageUtil만 사용하다가 Spring 기반으로 변경하기 위해 구글링, 작업한 내용을 정리 차원에서 올립니다.


1. applicationContext.xml에 다음 내용을 추가


<!-- for MessageUtil -->

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

        <property name="basenames">

            <list>

                <value>/WEB-INF/messages/messages</value>

            </list>

        </property>

        <property name="cacheSeconds" value="100000" />

        <property name="defaultEncoding" value="UTF-8" />

    </bean>

    <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">

        <constructor-arg ref="messageSource"/>

    </bean>

    <bean id="messageUtil" class="package.path.MessageUtil">

        <property name="messageSourceAccessor" ref="messageSourceAccessor"/>

    </bean>


2. MessageUtil




참고 사이트

http://springsource.tistory.com/113

http://blog.naver.com/pureb612b/10120505318

http://zinlee.tistory.com/204


WRITTEN BY
체리필터
프로그램 그리고 인생...

받은 트랙백이 없고 , 댓글이 없습니다.
secret