목차

반응형

1. 개요

Entity에 List<String>이 있고 이를 검색하는 코드를 구현하고자 한다.
결과 원하면 빠르게 3번만 보면 된다.

상황을 더 설명하자면 게시물에 tagList라는 List<String> 형태의 태그 프로퍼티가 있고, 사용자가 태그 검색을 할 때 리스트를 검색 결과에 포함시키는 방법이다.

DB 담겨져 있는 상황
Entity 정의

 

2. 관련 에러

private BooleanExpression hasKeyword(QCampaign qCampaign, String keyword)
    {
        if (keyword == null || keyword.equals(""))
        {
            return null;
        }


        BooleanExpression keywordInTagList = qCampaign.tagList.any().contains(keyword);
        BooleanExpression keywordInServeText = qCampaign.serveText.containsIgnoreCase(keyword);
        BooleanExpression keywordInMissionText = qCampaign.missionText.containsIgnoreCase(keyword);
        return keywordInServeText.or(keywordInMissionText).or(keywordInTagList);
    }

이런식으로 짜면 알아서 tagList안에 keyword가 포함된 경우 true를 반환할 것이라고 생각하기 쉬우나...

 

아래와 같은 에러를 만나게 된다. 정확한 원인은 찾지 못했으나 관련 문서도 못 찾아서 패스.

Cannot invoke "org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(boolean)" because "fromElement" is null

 

3. 구현 코드

private BooleanExpression hasKeyword(QCampaign qCampaign, String keyword)
    {
        if (keyword == null || keyword.equals(""))
        {
            return null;
        }

        BooleanExpression keywordInTagList = Expressions.stringTemplate("array_to_string({0}, ', ')", qCampaign.tagList).contains(keyword);
        BooleanExpression keywordInServeText = qCampaign.serveText.containsIgnoreCase(keyword);
        BooleanExpression keywordInMissionText = qCampaign.missionText.containsIgnoreCase(keyword);
        return keywordInServeText.or(keywordInMissionText).or(keywordInTagList);
    }

해결 방법은 array_to_string이라는 postgresql 함수를 사용하여 array를 하나의 string으로 바꾸고 해당 문자에서 검색을 하는 방법이다. 코드는 위와 같다.

 

응 잘작동함~

킹아~!

반응형

'Java > Spring' 카테고리의 다른 글

codedeploy java: command not found  (0) 2023.08.23
반응형

codedeploy 사용 도중 분명 직접 배포 커맨드 실행했을때 잘 되고 java -version도 잘 작동할때, 배포 인스턴스 혼자만 java 위치를 못찾을때

 

which java 써서 java 절대경로 찾은 뒤,

기존 코드가 path에 등록된 java를 사용하는 아래 코드라면

nohup java -jar -Dserver.port=${TARGET_PORT}  -Dspring.profiles.active=${DEPLOYMENT_GROUP_NAME} -Dspring.config.location=${SPRING_PROPERTIES_PATH}  ${PROJECT_PATH}/build/libs/* > ${PROJECT_PATH}/nohup.out 2>&1 &

 

java를 절대 경로로 찾아서 빌드하는 코드로 바꿔보자

nohup /usr/java/oracle/jdk-15.0.1/bin/java -jar -Dserver.port=${TARGET_PORT}  -Dspring.profiles.active=${DEPLOYMENT_GROUP_NAME} -Dspring.config.location=${SPRING_PROPERTIES_PATH}  ${PROJECT_PATH}/build/libs/* > ${PROJECT_PATH}/nohup.out 2>&1 &

 

좀 별로긴 한데, 이딴걸로 반나절 날려버려서 그냥 이렇게 바꾸고 해결하련다.

반응형

'Java > Spring' 카테고리의 다른 글

스프링 postgresql jpa querydsl List<String> 배열 검색  (0) 2023.09.06
반응형

1. 증상

인텔리제이 프로젝트 Open하면 아래 gradle 에러가 뜨면서 아무것도 되지 않을 때.

org.gradle.tooling.GradleConnectionException: Could not run phased build action using connection to Gradle distribution 'https://services.gradle.org/distributions/gradle-7.0-bin.zip

 

2. 해결방법

1. intellij 종료

2. 프로젝트 > '.gradle' '.idea' 'gradle' 폴더 삭제

3. C:\Users\유저이름 > .gradle 폴더 삭제

4. 이후 프로젝트 다시 Open

 

반응형

'Java' 카테고리의 다른 글

스프링 하위 URL 접속시 IP 제한  (0) 2018.12.24
반응형

1. 개요

intellij gradle 프로젝트 생성 후, 원하는 dependency가 있는데 설치하는 방법을 안내하겠다.

 

2. 문제상황

김영한 님의 JPA 강좌를 듣는데 강좌 초기 부분에서 일단 maven으로 하자고 하셨는데, 꼭~~~! 말 안 듣고 gradle로 하는 사람이 있다. 물론 본인도 평소에 gradle로 개발을 해왔기 때문에 말 안 듣고 gradle로 설치하였다.
문제는 원하는 hibernate, h2 database 2개를 설치해야하는데 어떻게 찾아야 하는지 아예 감도 안 잡히는 분들을 위해 간단한 글을 작성해 봤다.

 

3. 해결방법

본인이 원하는 dependency의 이름과 버전을 생각해 본다.
해당 강좌에서는 각각 "hibernate 5.3.10.Final", "com.h2database 1.4.199"이다.

구글에 검색한다 gradle depedency "이름 버전"

 

그러면 가장 첫 번째 게시물로 저 사이트가 나온다.

 

보면 본인의 상황에 맞는 gradle을 선택하면 gradle.build에 작성해야 하는 코드가 나온다.

implementation group: 'org.hibernate', name: 'hibernate-core', version: '5.3.10.Final'

 

1. dependencies에 해당 코드를 추가한다.

2. intellij에서 gradle 파일이 바뀌면 우측 상단에 gradle build를 해주는 버튼이 알아서 나타난다. 클릭한다.

 

그러면 하단에 build successful이라고 나오면 끝이다.

 

추가로 우측에 gradle을 누르고 Dependencies아래 항목을 살펴보면 설치된 dependency의 하위 항목을 확인할 수 있다.

반응형

'Java > Java' 카테고리의 다른 글

자바 보드게임 Laser Maze - 1  (0) 2018.04.10
자바 리눅스에서 777 권한으로 다음날짜 폴더 생성  (0) 2018.04.06
반응형

먼저 web.xml에서 xml bean 설정을 참조하는지 먼저 확인하기


web.xml파일 내에서

*.xml로 검색해보면

<servlet>

  <servlet-name>action</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  <init-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/config/springmvc/*.xml</param-value>

  </init-param>

  <load-on-startup>1</load-on-startup>

</servlet>

위와 같이 WEB-INF/config/springmvc/ 밑의 xml파일을 전부다

참조하도록 되어있는것을 볼 수 있다.


springmvc 경로로 들어가서 xml파일을 하나 추가해준다.(servlet-context.xml) 파일이 있는데

해당 파일에 아래와 같이 필터링을 추가해준다.

<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/sitesys/** "/>

<bean class="com.cmm.sysPathControllerInterceptor"/>

</mvc:interceptor>    

</mvc:interceptors>

이것의 이미는 sitesys로 접속하는 모든 URL에 대하여 sysPathControllerInterceptor.java 파일을 거치도록 하는것이다.


위에서 지정한 경로에 맞추어 sysPathControllerInterceptor.java파일을 생성한다.


소스는 아래와 같이 생성해준다.

public class sysPathControllerInterceptor extends HandlerInterceptorAdapter {

    @Resource(name = "IpAddrManageService")

private IpAddrManageService ipAddrManageService;

/**

* sitesys로 접근하였을때 허가된 IP가 아닐경우 리다이렉트가 안되도록 수정

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

IpInter is = new IpInter();

boolean res_bool = is.IpInterCepter(request, ipAddrManageService.SelectIpAddr());

if(!res_bool) {

response.sendRedirect("/mainPage.do");

return false;

}

return true;

}

}


위는 참고 소스입니다. 각 프로젝트별로 허용 IP 조회하는 방식이 다르기때문에 IP 관련 소스는 생략하도록 한다.

위에서 중요한 부분은 return false를 하면 요청한 URL로 페이지가 안넘어가는것이고(현재 소스는 response.sendRedirect를 이용하여 메인페이지로 넘어가도록 처리되어있다..)

return true를 하면 요청한 URL로 넘어간다는 것이다..

반응형
반응형

이클립스에서 빌드 후, 프로젝트를 서버에 배포 할 때 자주 발생하는 오류로 평소 주변 사람한테는 메이저 마이너 오류라고 일컫어서 말한다.


이미 인터넷 상에 많이 나와있는 오류로 원인은 현재 서버에서 사용하고 있는 JDK 버전과 빌드하여 배포하고자 하는 프로젝트의 Class 파일의 컴파일 JDK 버전이 호환이 안되기 때문에 발생하는 문제라고 한다.

그중에서도 51.0은 JDK 1.7을 지칭한다고 한다.


근데 필자의 경우 매우 헤맸던것이 분명 자바 버전은 1.7을 가리키고 있는데 위의 에러가 발생 한 것 이다.


해결하는 방법은 크게 두 가지다.

1. 서버의 JDK 버전을 업그레이드 -> 현재 서버에 다른 프로젝트가 많이 들어가 있어서 불가능


2. 프로젝트의 빌드 컴파일 JDK를 다운그레이드 -> 가능하지만 상황에 따라(maven 라이브러리들의 버전 호환x) 불가능한 경우도 있음.


결국 2번 방식을 택하기로 하였다.


현재 프로젝트의 jdk 버전은 java -version 명령어를 통하여 확인한다.(사실 이렇게 확인하면 틀릴수도 있다.)


버전을 확인해보니 1.7이었다. 아니 분명 빌드를 1.7기준으로 했는데 이클립스 로컬에서는 잘 작동하였지만 서버에 배포를 하고 가동을 해보니 오류가 나서 매우 당황했다.


일단은 JDK를 1.6으로 낮춰서 컴파일 한 뒤에, 프로젝트를 배포해보았다.

그랬더니 이번에는 또 java.lang.NoSuchMethodError 에러가 난다.

하 빡쳐 ... 분명 JDK 문제같은데 log 관련된 클래스가 제대로 작동을 안해서 그런 것 같아보인다.


그러던 도중 로그상에 찍힌 jar파일의 경로를 확인해보니까 라이브러리 밑에 있단는 것을 깨닫고 pom.xml의 maven 설정을 확인해보았더니 아니나 다를까 문제가 발생한 jar파일이 그곳에 적혀있었다.


그리고 해당 라이브러를 추적해보니 결국 해당 라이브러리를 포함하고 있는 최상위 라이브러리의 이름은 spring-context 4.0.9였다.

여기서 jdk를 낮추면 spring-context 버전도 낮추어야한다는 것을 깨달았다.

그래서 jdk를 낮춰서 빌드한 뒤에 spring context 버전도 낮춰서 빌드를 해보았으나 프로젝트에서 필수적으로 같이 구동해야하는 라이브러리들의 버전들도 맞지가 않아서 오류가 많이 발생하였다.

상사한테 물어보니 걔네들도 jdk 버전에 맞춰서 버전을 낮춰주면 된다고는 했는데 복잡해질수도 있으니까 그냥 jdk 버전을 맞춰서 프로젝트 배포하는 것이 편하다고 하였다.

그래서 jdk 버전을 낮춰서 작업하는 것은 포기하기로 하였다.


그리고 여기서 알게된 충격적인 사실


사실 내가 배포하려고 했던 서버의 jdk 버전이 1.7이 아니었던 것 이다.

jdk가 1.6 1.7 둘다 깔려있었고 기본적으로 linux 서비스에 등록된 java는 1.7이지만 톰캣에서 구동할때 사용하는 jdk는 1.6을 가리키고 있던 것 이었다.

그러니까 안되지 ㅡㅡ


톰캣을 구동하기 위한 스크립트 catalina.sh를 열어보면


위와 같이 JAVA_HOME으로 JDK의 경로에 대한 환경변수를 설정하는 부분이 있다.


echo $JAVA_HOME을 통하여 현재 톰캣에서 사용중인 java 경로를 확인한다.


bin에 java가 있어서 해당 자바 파일로 버전을 확인해보았다.


jdk 버전이 1.6이다.


결국 톰캣으로 JDK 1.7을 사용하는 서버에 새로 옮겨서 배포해보았더니 귀신같이 잘 된다.


반응형
반응형

spring에서 requestmapping에 get parameter로 받도록 되어있으면 페이지 주소가 아래처럼 뒤에 parameter에 대한 정보가 남기 마련이다.


보안상의 문제로 뒤에 붙는 주소들을 안보이도록 처리를 해달라고 요청이 왔다.

곰곰이 생각을 해보았는데 그냥 안보이도록 하는 것은 문제가 있었다.

그래서 기존에 parameter를 받아서 처리하는 requestmapping으로 넘겨주도록 redirect 해주는 requestmapping을 새로 추가하여 뒤의 인자값이 따라 붙지 않도록 수정해보았다.



bbslist.do가 기존에 parameter를 그대로 노출시키도록 되어있는 requestmapping이다.




하지만 페이지가 호출되고나서 주소창에서 보이는 뒤의 인자값을 안보이게 하고 싶은 것 이다.


requestmapping에 도달하기전 단계를 추가하기 위하여 sbbslist.do를 새로 생성해준다.


보통의 requestmapping과 다르게 RedirectAttributes를 사용한다.

해당 attributes에 원하는 데이터를 넘겨준 뒤, 마치 forward를 사용하듯이 redirect를 통하여 페이지를 넘겨준다.


페이지는 위와 같은데 이렇게 하면 get parameter로 따라붙는 인자값들은 보이지 않고 페이지의 호출이 완료 되었을 때 sbbslist.do라는 주소값을 가지고 페이지가 호출된다.



반응형
반응형

java 웹앱에서 로그인시 패킷에 입력한 아이디와 비밀번호가 암호화가 안되어서 날라간다고 암호화를 해달라고 요청이 왔다.

사실은 정교한 암호화를 해야하지만 급한일이 매우 많기에 일단 javascript와 java에서 쉽게 사용이 가능한 base64 암호화를 사용하였다.

form의 형태는 위와 같다.



현재 데이터를 입력한 뒤, 전송하면 위 처럼 암호화가 안되어서 날아간다.


javascript에서는 폼을 전송하기전에 btoa 함수를 사용하여 base64 암호화 처리를 해준다.

위 처럼 스크립트를 작성하면 전송도중 ID 부분에서 base64 암호화 결과값이 노출된 상태로 전송된다.

오늘 또 그 부분에 대해서 수정해달라고 요청이 왔기에

form에 hidden으로 아이디 넣는 부분을 만들어서 base64 암호화된 데이터는 따로 전송을 해줘야 할 것 같다.


일단 데이터는 암호화가 잘 되어서 날아간다.


위 처럼 base64 복호화 함수를 생성한다.

    public static String decrypt(String data) throws Exception {

if (data == null) {
return "";
}

byte[] hashValue = null; // 해쉬값
hashValue = data.getBytes();

return new String(Base64.decodeBase64(hashValue));
}



마지막으로 해당 객체를 이용하여 form에서 날아온 데이터를 복호화해서 사용한다.


반응형
반응형

톰캣을 돌리다 보면 java.lang.OutOfMemoryError: PermGen space 오류를 만날때가 있다.

로컬에서는 손쉽게 해결이 가능하지만 아무래도 cui 환경에서는 당황하기 쉽다.


회사의 동료가 갑자기 메모리 오류가 나서 지원을 하게 되었다.

일단 tomcat을 구동할때 불러오는 스크립트를 찾아야한다.

catalina.sh라고 알려져있는데 작업하던 서버에는 없었다.



vi /etc/rc.d/init.d/tomcat -> 톰캣버전에따라 다르다 나같은경우는 tomcat6

vi로 까보면 각종 설정이 있다. 근데 tomcat 환경설정을 하는 스크립트는 없다.

이곳에서 또 tomcat 환경설정을 해주는 스크립트를 불러온다.

/를 누르고 검색모드에서 TOMCAT_SCRIPT를 찾는다.


vi로 까본다.


그러면 그곳에 또 톰캣 conf파일이 있다.

얘를 까본다.



그러면 이제 좀 뭔가 톰캣설정하는 구문들이 보이는데(JAVA_OPTS 이런거)

여기다가 적당히 메모리를 증진시켜주는 명령어를 넣어준다.

JAVA_OPTS=" -Xms512m -Xmx1024m -XX:MaxPermSize=256m"



그러면 이제 톰캣 재시작하고 제대로 반영이 제대로 되었는지 확인해본다.



ps -ef |grep tomcat6 -> (톰캣버전은 알아서 맞춰서 적어야함)

확인해보면 적었던 명령어로 제대로 돌아가고 있는 것이 확인이 된다.


이후 오류메시지가 안떴음.





반응형
반응형

웹사이트(jsp)에 휴대폰 인증을 붙였는데 인증하고나서 아래 오류가 뜨면서 다음 페이지로 안넘어 갈 때가 있다.


blocked a frame with origin null from accessing a cross-origin frame


대강 이 오류는 근원이 다른 홈페이지(내 홈페이지, 인증 모듈 홈페이지)javascript를 통하여 근원이 다른곳에서 window를 조작하려고 할 때 발생하는 오류다.


보통 휴대폰 인증 모듈의 샘플에는 부모 윈도우를 조작하기 위해 opener.window.name 이런식으로 조작하는데

윈도우의 이름을 지정해줘서 그 값으로 조작해주면 잘 된다.



본인인증을 호출하는 홈페이지에서 호출하기전에 window.name을 통하여 윈도우 이름을 바꿔준다.


이후 타겟을 opner.window.name에서 "window"로 바꿔준다.

반응형