본문 바로가기

JAVA

(9)
[JAVA] 자바 enum 을 활용해서 코드 심플하게 개선하기(이런 것까지 가능하다) 저번에 자바 인터페이스를 활용한 경험담을 소개했었는데 그 당시 코드에 보면 if else를 이용해서 클래스를 생성하는 부분이 있었습니다. 2019/05/09 - [JAVA] - [JAVA] 자바 인터페이스(Interface)는 어떤 경우에 사용하나?(실전 프로젝트 경험담) 문제가 되는 소스코드 public ApiI getApi(String apiKey){ ApiI api = null; if(apiKey =="API_A"){ api = new ApiA(); }else if(apiKey =="API_B"){ api = new ApiB(); }else if(apiKey =="API_C"){ api = new ApiC(); } ..... return api; } 이런 로직을 사용하는 경우가 많을 겁니다. 보통은..
[JAVA] 자바 인터페이스(Interface)는 어떤 경우에 사용하나?(실전 프로젝트 경험담) 여러분은 자바로 프로젝트할 때 인터페이스(Interface) 많이 사용하시나요? 전 공공기관 SI 프로젝트 위주로 스프링 프레임워크를 이용해서 개발을 진행하다 보니 Serviec Interface를 제외하고는 거의 사용할 일이 없었습니다. 공공기관 SI 프로젝트는 대부분 데이터 위주이다 보니 대부분의 코드는 아래처럼 흘러갑니다. 사용자 요청(HTTP request) Controller 가 받아서 Service로 넘기고 Service는 DAO를 호출하고 DAO는 DB에서 데이터를 조회해서 다시 Service로 리턴하고 Service는 데이터를 이용해서 로직을 수행하고 결과를 다시 Controller로 넘기고 Controller는 다시 사용자에게 응답하게 되죠. 대부분 이런 로직이다 보니 Service 의 ..
[JAVA] HTTP requst 정보 (클라이언트 IP, 헤더, URL 등) 총 정리 자주 사용하는데 막상 사용하려고 하면 메서드명이 잘 생각나지 않아서 request 정보 정리했습니다. 사용자 로그를 저장하거나, 사용자 접속환경 등을 판단할 때 자주 사용했습니다. JSP 파일로 만들어서 사용했던거라 문구가 추가되어 있습니다. ■ local의 기본 정보 (IP, Name, Port) Local IP : Local Name : Local Port : ■ 클라이언트의 정보 Remote IP : Remote Host : Remote Port : ■ 서버 이름과 포트 (일반적으로 local 기본정보와 동일) Server Name : () Server Port : ■ 지역 정보 (대부분 한국을 의미하는 ko가 나옴) Locale : ■ 사용하는 프로토콜 ("프로토콜/메이저버전.마이너버전" 의 형태..
[JAVA] Secure 코딩, 취약점 해결, 보안을 위한 방법 정리 프로젝트를 진행하면 반드시 시큐어코딩을 점검하게 됩니다. 대부분 툴로 돌리기 때문에 오탐도 많이 나오긴 하지만 일단 기본적인 보안 취약점 요소와 해결방안을 간략하게라도 알고 코딩하는게 좋습니다. Unreleased Resource Abstract : 프로그램이 시스템 리소스를 해제하지 못할 수도 있음 Explanation : 전반적인 소프트웨어 안정성 문제를 일으키지만 공격자가 의도적으로 리소스 누출을 일으킬 수 있는 경우 리소스 풀을 고갈시켜 denial of service 공격을 일으킬 수도 있습니다. Recommendation : 개체를 사용해서 처리하는 동안 예외가 발생하면 close() 등의 자원반납 메서드가 실행이 안될 수 있다. 따라서 예외발생시에도 자원반납이 이루어지도록 try catch를..
[JAVA] 스프링(Spring) 에서 스케줄러 직접 실행하기 (Spring Quartz + job scheduler + JobKey + triggerJob) 저번에는 스프링에서 스케줄러를 설정하는 방법을 알아봤었습니다. 2019/04/10 - [JAVA] - [JAVA] 스프링(Spring) 에서 자동실행 스케쥴러 설정하기 (Spring Quartz + job scheduler + Cron Expression) 그런데 해당 기능을 사용하다가 수동으로 직접 스케줄러를 실행해야하는 경우가 발생할 수 있습니다. 오류가 발생해서 스케쥴러 실행이 안되었거나 스케줄러 실행결과가 잘못되어 다시 실행해야하는 경우 등등.. 저는 스케쥴러를 뉴스 RSS 를 통해 이슈 키워드를 분석하는 서비스에 스케쥴러를 설정했는데 가끔 데이터가 잘못 나오는 경우가 있더군요. 아무래도 새벽 6시에 돌아가는데 간혹 RSS 로 내보내는 뉴스기사가 부실한 경우에 데이터가 맘에 안들게 나왔습니다. 주..
[책요약] 자바 성능을 결정짓는 코딩습관과 튜닝이야기 - 이상민 저 전 개발자 신입일 때부터 에버노트를 이용해서 프로그래밍 관련된 내용을 정리하고 있습니다. 티스토리를 시작하면서 포스팅만할 내용을 찾고자 예전에 작성했던 문서들을 보고 있는데 책요약한게 있네요. 이 책을 읽고 난 후 벌써 5년이라는 시간이 지났네요. 개발 2년차 때 읽고 요약했던건데 지금 다시 읽어보니 유용한 내용이 있어서 같이 공유하고자 포스팅합니다. 책 제목 : 자바 성능을 결정짓는 코딩습관과 튜닝이야기 책 저자 : 이상민 디자인 패턴 Service Locator : 서비스와 컴포넌트 검색을 쉽게 하는 패턴 ==> 빈번히 사용되는 객체를 찾을 때 소요되는 응답속도를 감소시키기 위해 Map객체에 찾은 객체를 보관하고 있다가 그 객체를 필요로 할 때 메모리에서 찾아서 제공한다. public class Se..
[JAVA] String 문자열 자르기. 일정 글자수 만큼 잘라서 사용하는 방법 (substring 함수) 어떤 경우에 사용했나? 특정글자에 대한 형태소분석 결과를 뽑아내는 로직을 개발중이었습니다. 형태소분석기 API를 활용하는데 한번에 처리할 수 있는 글자수가 만글자 이내로 정해져있었습니다. StringBuffer에 담은 글자들을 형태소분석기 API에 보내기 전에 만글자가 넘는지 체크를 하고, 만글자가 넘으면 글자수를 나누어서 형태소분석기 API에 보내야 하는 상황이었습니다. 처리결과 //실제 text값은 훨씬 깁니다. String text = "엑소브레인은 내 몸 바깥에 있는 인공 두뇌라는 뜻으로, 세계 최고인공지능 기술 선도라는 비전을 달성하기 위한 과학기술정보통신부 소프트웨어 분야의 국가 혁신기술 개발형 연구개발 과제이다."; List entityList = new ArrayList(); int max..
[JAVA] 스프링(Spring) 에서 자동실행 스케쥴러 설정하기 (Spring Quartz + job scheduler + Cron Expression) 어떤 경우에 사용하나? 주기적으로(ex: 매 1시간 마다) 또는 정해진 시각(ex: 매일 오전 7시) 에 특정 프로세스를 수행하고 싶은 경우에 사용합니다. 저는 매일 오전에 특정 API를 호출해서 데이터를 읽어온 후 형태소분석을 한 후 키워드 노출수를 추출하는 로직에 사용했습니다. pom.xml에 dependency 추가 최신 버전은 MAVEN 홈페이지에 참고하세요. https://mvnrepository.com/artifact/org.quartz-scheduler/quartz org.quartz-scheduler quartz 2.3.0 로직을 처리할 Job 클래스 생성 QuartzJobBean을 extends 하게 되면 executeInternal 메서드를 오버라이드 하게 되어있습니다. 스케쥴러에 의해..
[JAVA] 키워드 중요도에 따른 노출 순위 표시(Map merge + Map 을 List로 변환 + List sort + java8버전 + 람다식 표현) 특정문장을 형태소분석하고, 많이 노출된 키워드 순으로 10개까지만 노출하는 로직에 사용된 자바 주요 기능 정리입니다. (형태소분석 API를 사용하는 부분은 패스) 아래와 같이 문장을 형태소분석한 결과 데이터(Json형태)가 있다고 가정하겠습니다. data=[ {id=4.0, text='청년구직활동지원금', head=7.0, label=NP, mod=[], weight=0.0212487}, {id=5.0, text=3월부터, head=7.0, label=NP_AJT, mod=[], weight=0.138904}, {id=6.0, text=접수, head=7.0, label=NP, mod=[], weight=0.502624} {id=7.0, text='청년구직활동지원금', head=7.0, label=NP,..