728x90
반응형

Java 53

JUnit Test Code에서 Slf4j logger 이용하기

그 동안 JUnitTest Code에서 @Slf4j 어노테이션을 이용해 로거를 사용하려 하면 다음과 같은 오류가 발생 했었다. 그냥 무슨 이유가 있는가 보다 하고 그냥 System.out.println을 사용 하였는데, 갑자기 궁금함에 검색해 보니 stackoverflow 에 이미 답이 있더라. stackoverflow.com/questions/29076981/how-to-intercept-slf4j-with-logback-logging-via-a-junit-test How to intercept SLF4J (with logback) logging via a JUnit test? Is it possible to somehow intercept the logging (SLF4J + logback) and ..

Java/Spring 2021.04.01

Java 기본 내용을 위한 북마크

Memory, GC yaboong.github.io/java/2018/05/26/java-memory-management/ 자바 메모리 관리 - 스택 & 힙 개요 Java 에서 메모리 관리는 어떻게 이루어지는지 알아보기 위함. Stack 과 Heap 영역 각 역할에 대해 알아본다. 간단한 코드예제와 함께 실제 코드에서 어떻게 Stack 과 Heap 영역이 사용되는지 살펴 yaboong.github.io yaboong.github.io/java/2018/06/09/java-garbage-collection/ 자바 메모리 관리 - 가비지 컬렉션 개요 Java 가비지 컬렉션에 대해서 공부한 내용을 정리해본다. Java 에서 메모리 관리는 어떻게 이루어지는지 이해하고 있으면 좋다. 자바 메모리 관리 - 스택 &..

Java 2021.01.28

Reative 관련 북마크

www.reactivemanifesto.org/ko 리액티브 선언문 탄력성(Resilient): 시스템이 장애 에 직면하더라도 응답성을 유지 하는 것을 탄력성이 있다고 합니다. 탄력성은 고가용성 시스템, 미션 크리티컬 시스템에만 적용되지 않습니다. 탄력성이 없는 시 www.reactivemanifesto.org woowabros.github.io/experience/2019/03/18/tech-toby-reactive.html 3월 우아한 Tech 세미나 후기 - 우아한형제들 기술 블로그 스프링 리액티브 세미나 후기 woowabros.github.io devahea.github.io/2019/04/21/Spring-WebFlux%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%A..

Java/Reactive 2021.01.27

테스트 코드 작성 시 willReturn 값이 안나오는 경우

오랜만에 테스트 코드를 작성하기 위해 구글링 해서 작성을 했는데 내가 짜 놓은 시나리오대로 동작을 하지 않아 더 구글링, 그리고 주변에 사람들에게 질문을 하였지만.... 해답은 안 보였다. 작성한 테스트 코드는 아래와 같다. import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springf..

Java/Spring 2020.12.02

멀티 DataSource 접속 방법 정리

한 개의 프로젝트에서 하나의 Database에만 접속하는 경우가 대부분이지만, 2개 이상의 데이터 베이스에 접속하는 경우도 발생하게 된다. 이럴 경우 어떻게 셋팅을 해야 하는지 정리한다. application.yml 설정파일 spring: profiles: active: local application: name: usercms application-local.yml server: port: 9090 spring: profiles: local domain: localhost datasource-a-write: driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://a-db-url:3306/a?autoReconnect=true&useSSL=fals..

Java/Spring 2019.08.13

QueryDSL 사용하기

JPA를 사용하면서 QueryDSL을 셋팅하고 사용하는 부분에 있어서 매번 헷깔려 정리한다. QueryDSL을 사용하기 위해서 build.gradle 파일에 아래의 내용을 추가 해 준다. plugins { ... id 'idea' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' ... } dependencies { ... implementation 'com.querydsl:querydsl-apt:4.1.4' implementation 'com.querydsl:querydsl-jpa:4.1.4' ... } ext { querydslSrcDir = 'src/main/generated' queryDslVersion = '4.1.4' } configuratio..

Java/Spring 2019.08.08

파라미터에 따라 특정 변수에 값 Set 하기

Java로 Entity를 만들고 멤버 변수로 1 ~ 31일을 만들어 둔 다음 넘오는 날짜에 따라 특정 날짜 변수에 값을 담는 작업을 하다 알게 된 내용이다. 역시 새롭게 알게 된 내용이라 정리 차원으로 올린다. MontTimeTable Entity는 아래와 같다. @Entity @EntityListeners(value = {AuditingEntityListener.class}) @Data @Table(name = "month_timetable") public class MonthTimetable { @Id @Column @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private Integer policy_inst..

Java/Spring 2018.10.24

JPA QueryDsl 에서 Group By Count 값 가져오기

JPA, QueryDsl 쓰기 참 힘들다. 그래도 하나 하나 어렵게 해 나가고 있는데 오늘은 또 Group By한 Count 개수를 반환하는 것을 만든 삽질 내용을 올린다. 리파지토리 단 소스는 아래와 같다. @Override public QueryResults getBusinessTotalCount() { QUser user = QUser.user; return from(user).where(user.userType.eq(UserType.B2B)).groupBy(user.platform).select(user.platform, user.platform.count()).fetchResults(); } 그리고 가지고 온 내용을 가지고 맵으로 이쁘게 정렬해서 반환해 주면 된다. public Map getBu..

Java/Spring 2018.09.28

캐릭터셋에 대한 고민...

회사에서 sms 발송 시 특정 문자가 깨져 나가는 문제가 발생...sms 발송 시스템은 "세X 텔레X"을 사용 하는데 특정 DB에 값을 넣어 두면 jar로 실행 되는 데몬이 해당 DB 값을 읽어서 발송 하는 방식임.DB에 값이 들어갈 때까지 UTF-8 형식이고 깨지지 않고 들어가는데, 실제 폰에서 받아 보기만 하면 깨지는 상황.깨지는 문자는 "–" 임. 일반 키보드에서 치는 "-"와는 다르고, 워드나 한글 등에서 copy & paste 한 것으로 보임.실제 폰에서 받아 볼 경우 해당 문자는 "?"으로 치환 되어 옴. 해당 현상을 재현 하기 위해 php에서 테스트 해 보았으나 재현 안되고Java에서는 아래와 같은 방식으로 재현 됨. 콘솔에 찍힌 결과 값은 아래와 같음.euckrString : 201? 21..

Develop! 2018.03.21

Java8의 for, stream foreach, parallelStream foreach 간단 속도 테스트

Java8에 들어간 stream, parallelStream이 좋다는 이야기만 듣고 대충 개념만 이해한 상태에서... "그냥 좋겠지"란생각으로 쓰려다... 간단하게 테스트 해보고 정리 ^^ 참고로 로컬 PC에서 돌렸으며, 로컬 PC의 물리 cpu 코어 개수는 4개이다. import java.util.ArrayList; import java.util.List; public class StreamTest { public static void main(String[] args) throws InterruptedException { List intList = new ArrayList(); // 테스트할 loop의 개수... for (int i = 0; i { if(integer % 1000 == 0) { Sys..

Java 2017.02.14

원격지의 이미지 파일을 읽어서 원하는 곳에 업로드 하기

보통 개발 시에 파일 업로드를 하려 하면 html form에서 multipart/form-data로 파일을 선택해서 업로드 하고, 이를 서버 단에서 받아 처리를 하게 된다. 하지만 이런 방법이 아니라 원격지의 이미지 파일을 읽어온 후 필요 시 리사이지, 그리고 나서 다시 다른 곳에 있는 서버로 파일을 업로드 하는 기능이 필요해 개발을 하다 보니, 많이 사용되는 방법이 아니기에 정리해 둔다. import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.file.Files; impor..

Java 2017.02.09

이미지 파일 업로드 오류 수정 기록...

구매후기 이미지 업로드에서 오류가 나고 있어서 해당 내용을 검토 중에 알게 된 내용을 정리합니다. 기본적으로 아래와 같은 방식으로 업로드가 되고 있습니다. 브라우저 -> 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-..

Java/Spring 2016.11.08

Spring Batch(스프링 배치)에서 작업 시간이 길어지는 경우

Spring Batch를 그닦 많이 써본 경험이 없지만, 특정 요구 사항이 있어서 개발하게 되었습니다.작업을 하면서 겪은 오류를 어떻게 해결 했는지 History 및 Backup을 위해 적어 둡니다. 보통 배치는 Reader와 Writer로 구분합니다.특정 정보를 Reader에서 읽어 들여서 필요한 내용을 가공하고 Writer에서 필요한 행동을 합니다. 그런데 Reader에서 정보를 읽어 들이고 가공하는 시간이 오래 걸리면서 Writer에서 DB Connection을 못 찾게 되고, Writer 작업을 수행하지 못하게 되는 경우가 발생했습니다. 구글링을 한 결과 "autoReconnect 값을 true로 해라", "validationQuery를 날려라" 등등이 나왔지만 유효하지 않은 해결책이였습니다. 결..

Java/Spring 2016.10.27

List에서 특정 요소 제거하기

List에서 불필요한 item을 제거하기 위해 loop를 돌리게 되면 제거 후 size가 맞지 않는 일로 인해 null point exception을 만나기가 쉽다. 이럴 경우 제대로 된 방법이 무엇인지는 모르지만... 실제로 돌려보고 Exception이 나지 않은 방법을 찾아 정리 차원에서 남겨 둔다. 검색해서 참고한 URL은 https://stackoverflow.com/questions/17279519/removing-items-from-list-in-java/17279565#17279565?newreg=0dee1db24aaa4154a0cebdc173ed5aeb List toRemove = new ArrayList(); for(Object a: list){ if(a.getXXX().equalsIgn..

Java/Etc 2016.02.11

MySQL의 zero date("0000-00-00 00:00:00") 값이 Date 값으로 넘어오지 않는 경우

MySQL에 DateTime 필드에 값이 없을 경우 기본 값으로 "0000-00-00 00:00:00" 들어가는 경우가 있다. 이럴 경우 쿼리해 온 값이 Java의 Model 객체에 Setter로 값을 넣는 과정에서 에러가 발생한다. 에러 메시지는 다음과 같다. "Cannot convert value '0000-00-00 00:00:00' from column 4 to TIMESTAMP" 뭐 '0000-00-00 00:00:00' 값은 timestamp 값으로 바꿀 수 없다는 메시지 같은데... 이럴 경우 어떻게 해결해야 하나 고민하다가 구글링을 통해 알게 된 내용을 정리한다. 보통 Model 객체의 Setter를 아래와 같이 작성하게 된다. setter에서 Date 객체로 받아야 하는데 값을 넘겨줄 수..

Java 2015.04.06

Spring에서 MessageUtil 사용하기

다국어 사용을 위해서 그동안 Struts2 기반 MessageUtil만 사용하다가 Spring 기반으로 변경하기 위해 구글링, 작업한 내용을 정리 차원에서 올립니다. 1. applicationContext.xml에 다음 내용을 추가 /WEB-INF/messages/messages 2. MessageUtil import java.util.Locale; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.web.context.reques..

Java/Spring 2015.02.24

GPS 좌표를 이용한 거리 구하기

구글링을 통해서 GPS의 좌표를 통한 거리 구하는 공식을 어렵게 찾아 적용했다.내용은 아래와 같다. if(oldCoordinate != null) {// TODO 거리 누적...double theta = oldCoordinate.getLongitude() - Double.parseDouble(lp.getLongitude());double dist = Math.sin(Utility.deg2rad(oldCoordinate.getLatitude())) * Math.sin(Utility.deg2rad(Double.parseDouble(lp.getLatitude()))) +Math.cos(Utility.deg2rad(oldCoordinate.getLatitude())) * Math.cos(Utility.deg2r..

Java/Android 2013.07.29

Site-mesh에서 excludes 정의가 적용 되지 않을 경우

Site-mesh의 decorators.xml 파일에서 excludes를 정의해서 사용하려 했지만 여전희 decorator 파일이 적용 되는 상황이 발생했다. 여기 저기 구글링 해 봤지만 내 검색 능력의 한계인가 잘 찾질 못했다. 결국 사내 아는 분에게 문의해서 원인을 알게 되었다. sitemesh.xml decorators.xml /uninstall/* /download/* /intro/* /notice/* /* 위의 decorators.xml에서 uninstall 부분만 decorator를 적용하지 않으려 했지만 처음에는 적용 되지 않았고, 이에 sitemesh.xml의 아래 부분이 추가 되면서 문제가 해결 되었다. 삽질은 정말 해도 해도 끝이 없는거 같다.

Java/Etc 2010.05.14

ActiveMQ 사용하기

실 서비스 도중에 대량의 작업을 동기식으로 작업하려면 부담이 되는 경우가 많다. 이럴 경우에는 비동기식으로 작업을 하게 되는데, 보통 Queue에 작업해야 할 목록을 집어 넣어두고, 나중에 Cosumer가 해당 작업을 하도록 만드는 것이 일반적이다. 이런 작업을 하는데 유용한 도구가 ActiveMQ이며 이번 주소록 프로젝트를 하면서 ActiveMQ를 사용하게 되어 정리차원에서 블로그에 올려본다. 설치하기 이전에 우선 환경을 셋팅해야 한다. JDK는 1.5.x 버젼 이상 설치되어 있어야 하며, " JAVA_HOME" 환경 변수는 JDK가 설치된 경로로 잡혀 있어야 한다. Maven은 1.0.2 이상 설치되어 있어야 한다.(Maven은 소스 설치 또는 개발자 버젼 설치를 위해 필요한 듯...) 또한 관련 J..

Java/Etc 2010.03.23

Java addCookie 삽질기

매일 프로그램 삽질은 하고 있지만 이번 건은 유난히 더 삽질이 길었다. 3일 동안 아무런 일도 못하고 이 일에만 매달렸다. 다른 일을 하긴 해야 하지만, 개발자 자존심에 해결하지 못하고 넘어가기에도 뭐 하고... 결국에는 해결하게 되었지만 아무것도 아닌 원인 때문에 해결하고도 짜증이 난다. 증상은 다음과 같다. package com.naver.widget.action; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.naver.widget...

Java/Etc 2010.03.10

Like 검색에서 wild 문자인 _, % 검색 되도록 하기

프로젝트를 진행하면서 BTS로 _, %로 검색시 검색이 제대로 안된다는 내용이 등록되었다. 해당 내용을 해결하기 위해 구글링 하던 도중 아래와 같은 내용을 찾게 되었다. http://okjsp.pe.kr/seq/2372 '_', '%'와 같은 문자들이 검색을 하기 위한 wild 문자로 사용되지 않고 리터럴 문자로 사용되기 위해서는 뒤에 escape '\' 와 같이 사용해 주어야 한다는 것이다. 즉 다음과 같이 사용하면 되는 것이다. LIKE '%검색어\_\%% escape '\' 사용하고 있는 DB는 CUBRID 였으며, 위와 같이 할 경우 잘 동작 되었다. 위 내용을 수정하면서 SQL Injection 위험이 있던 '%$keyword$%' 부분도 '%#keyworkd#%'로 바꾸게 되었다. 하지만 이 ..

Java/Etc 2009.09.28 (1)

스트럿츠를 사용하여 객체 출력하기

일반 프로퍼티 또는 List 타입의 프로퍼티를 출력하는 방법은 이미 살펴 보았다. 프로퍼티가 아닌 객체 자체를 출력하는 경우는 다음과 같이 할 수 있다. struts.xml /chapter2/printObject.jsp example.model.Product.java package example.model; public class Product { private String name; private String modelNo; public Product() {} public Product(String name, String modelNo) { this.name = name; this.modelNo = modelNo; } public String getName() { return name; } public..

Java/Struts2 2009.05.11

스트럿츠를 사용하여 List 출력하기

이번에는 스트럿츠를 사용하여 List를 출력해 보자. 일단 Action 파일과 result 파일 정의를 struts.xml에 정의하면 다음과 같다. /chapter2/printStringList.jsp 위에서 정의한 대로 PrintStringListAction.java 파일을 example.chapter2 패키지에 만든다. package example.chapter2; import java.util.ArrayList; import java.util.List; public class PrintStringListAction { private List listString; public String execute() throws Exception { listString = new ArrayList(); list..

Java/Struts2 2009.05.06 (1)

스트럿츠2 설정하기

스트럿츠를 사용하기 위해 스트럿츠 환경을 구축할 필요가 있다. 우선은 이클립스에서 다음과 같이 'Dynamic Web Project'를 하나 생성한다. 그런 다음 위에서 볼 수 있는 것처럼 몇가지 내용을 추가해야 한다. 우선은 필요한 라이브러리를 추가해 보자. http://struts.apache.org/에서 해당 버전을 다운받는다. 현재 시점에서 가장 최신 버젼은 2.1.6이다.(http://struts.apache.org/download.cgi#struts216) 다운 받은 파일의 압축을 풀면 lib 디렉토리에 jar 파일들이 있는데, 그 중에서 필요한 jar 파일들을 추가한다. 추가해야 할 파일 목록은 다음과 같다. antlr-2.7.2.jar commons-beanutils-1.7.0.jar co..

Java/Struts2 2009.04.28 (2)

필터 - RESPONSE

필터를 통해 서블릿이 실행되기 전에 특정 액션을 하게 만들 수 있다고 했다. 그런데 서블릿이 실행되고 나서 특정 액션을 하게 만들려면 어떻게 해야 할까? 간단하게 생각해 보면 필터의 doFilter()메소드 안에 있는 chain.doFilter(request, response) 를 마치고 나서 작업하면 될 것 같다. 하지만, 서블릿에 넘겨주는 response 객체를 서블릿이 사용하게 되면, 필터를 거치지 않고 바로 클라이언트로 response 하게 된다. 따라서 doFilter를 통해 response를 넘길 때 새로운 응답 객체(HttpServletResponse를 구현한 객체)를 만들어 넘기는 방법을 써야 한다. 하지만, HttpServletResponse는 간단한 클래스가 아니므로, 썬에서 구현해 둔..

Java/Servlet & JSP 2009.04.28

필터 - REQUEST

모든 서블릿 앞단에서 공통적으로 처리해야 할 내용이 있을 경우 필터를 사용해서 해당 내용을 처리할 수 있다. 필터는 자신만의 고유 API가 있으며, 컨테이너가 이 API를 알고 호출해 준다. 해당 API는 init(), destroy(), doFilter()이다. 그리고 호출해야 할 필터는 DD(web.xml)에서 설정하게 된다. 하나의 예제로 필터를 만들어 보면 다음과 같이 할 수 있다.(Head & First 예제) BeerRequestFilter.java package com.example.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.F..

Java/Servlet & JSP 2009.04.16 (1)

웹 애플리케이션 보안

보안을 위해서는 인증(Authentication), 인가(Authorization), 데이터 무결성(Data Integrity), 기밀성(Confidentiality)이 보장 되어야 한다. 인증이란 쉽게 말해 로그인을 통해 누구인지 서버(컨테이너)가 알 수 있도록 체크하는 단계이다. 인가는 인증된 사용자의 권한 레벨을 확인할 수 있도록 체크하는 단계이다. 데이터 무결성이란 클라이언트가 서버에 보낸 정보가 변경되지 않도록 하는 것이며, 기밀성이란 중간에 해당 데이터를 엿보지 못하도록 하는 것이다. 인증 및 인가 작업은 php에서도 많이 하는 작업이므로 그 의미에 대해서 별 다른 설명은 필요해 보이지 않는다. 자세한 설정 방법 및 사용 법은 아래 예제들을 통해 알 수 있다. 우선은 서버 자체에서 지원하는 인..

Java/Servlet & JSP 2009.04.10 (4)

썬 개발자 뉴스레터(SDN) 메일에 블로그 글이 실렸었네요.

그냥 정기적으로 보내주는 형식의 메일을 잘 확인 안해보는 습관이 있어서, 썬에서 보내주는 메일도 확인도 안해보고 넘기다가 오늘 우연치 않게 지메일을 확인하다 아래 내용을 발견 했네요. 별볼일 없는, 그냥 Head & First 책에 나오는 내용을 정리한 포스팅인데, 그 내용이 뉴스레터에 실리다니... 참으로 창피하네요 ^^;; 내용도 기초적인 내용이고 ㅎㅎ 이메일에 실린 포스트는 http://www.4te.co.kr/566 입니다. 나중에 고수가 된다면, 기초적인 내용이 아닌 정말로 유익한 정보를 블로그에 포스팅을 쓸수 있겠죠 ㅎ 하지만 이 놈의 귀차니즘 때문에 진도가 느려서 탈입니다. ㅎㅎ

인생이야기/Gossip 2009.04.08 (2)

웹 애플리케이션 배포하기

어떤 파일이 어느 곳에 위치하는지는 중요하다. php를 개발 할 때 프로그래머가 임의로 정하는 장소와는 달리 Java(JSP)는 어느정도 rule을 가지고 특정 위치에 특정 파일을 배포해야지만, 전체 웹 애플리케이션이 돌아가기 때문이다. 따라서 중요한 몇개의 파일 타입별 배포 위치에 대해 정리해 보면 아래와 같다. 정적인 컨텐츠(html, 이미지) 및 jsp 루트 디렉토리 및 그 하위 디렉토리 WEB-INF 밑에 배포 할 경우에는 클라이언트가 직접 접근할 수 없다. 대신 웹 애플리케이션에서 접근을 하게 만들 경우를 위해서 배포할 순 있다. 태그파일(.tag) - http://www.4te.co.kr/567 참고 WEB-INF/tags 디렉토리에 배포 DD 파일 이름은 web.xml이어야 하며 WEB-IN..

Java/Servlet & JSP 2009.04.07
728x90
반응형