본문 바로가기 메뉴 바로가기

Reimaginer

프로필사진
  • 글쓰기
  • 관리
  • 태그
  • 방명록
  • RSS

voyager.woo@gmail.com

검색하기 폼
  • All Posts (132)
    • Project Management (1)
    • Software Design (7)
    • Opinions (7)
    • JAVA (15)
    • Java Script (11)
    • HTML & CSS (1)
    • Web & Networks (5)
    • Container (8)
    • Data Science (1)
    • UWP & C# (1)
    • Tools (4)
    • Book reviews (18)
    • My Study (2)
    • Retrospectives (12)
    • Mistake management (10)
    • Emotional memo (3)
    • Careers (4)
    • Voyages (9)
    • ETC (6)
    • Old (5)
  • 방명록

JAVA (15)
Spring EventListener 관련한 이슈

비즈니스 로직과 상관없지만 해야하는 일들이 있을 때, Spring 프레임워크에서 제공하는 Event를 사용하여 비즈니스 코드와 비즈니스와 관련 없는 코드의 의존을 분리한다. 예를 들어, 비즈니스 특정 행위를 로그 테이블에 적재해야 할 때, 나의 판단에는 비즈니스의 흐름에 로그 테이블에 적재하는 코드를 넣는 것은 비즈니스 흐름을 읽는 데 방해가 된다. 그래서 이벤트를 발생시키고 해당 이벤트의 Listener 객체가 해당 작업을 수행하도록 한다. 참고; https://javacan.tistory.com/entry/Handle-DomainEvent-with-Spring-ApplicationEventPublisher-EventListener-TransactionalEventListener 스프링 Applicat..

JAVA 2020. 6. 3. 03:20
JPA에서 SQL Error: 1064, SQLState: 42000 만났을 때

https://stackoverflow.com/questions/41149529/sql-error-1064-sqlstate-42000-caused-by-org-hibernate-exception-sqlgrammar SQL Error: 1064, SQLState: 42000 - Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement I am really exhausted in solving the below error. Any help is very much appreciated. org.springframework.dao.InvalidDataAccessResourceUsageException: could not..

JAVA 2020. 5. 9. 00:20
JPA로 생성된 쿼리에 주석 붙이기

최근에는 명령(Command)과 조회(Query) 모델을 분리해서 개발하고 있다. 그래서 JPA로 명령 모델에서 쓰이는 엔티티와 조회 모델에서 쓰는 엔티티를 따로 만든다. 그런데 생성, 삭제, 변경 류의 명령(command) 모델에서 생성된 쿼리들은 간단하고 식별하기 쉽지만, 조회 모델에서 Hibernate가 만든 복잡한 쿼리들은 이게 어떻게 실행된 쿼리인지 식별하기 어렵다. 현재 회사에서는 DBA가 가끔 슬로쿼리를 뽑아서 전달해 주는데, 해당 쿼리가 어디서 실행된 쿼리인지 찾는데 좀 오래걸린 경험이 있다. 그래서 조회용 쿼리에 주석을 붙여서 찾기 쉽게 해보려고 한다. 관련 코드는 아래 깃헙 링크에 있다. 코드는 코틀린으로 작성되어 있다. https://github.com/voyagerwoo/spring..

JAVA 2019. 12. 13. 07:43
실행가능한 Groovy jar 만들기

"함수형 사고"라는 책을 읽게 된 후 Groovy는 나에게 너무 매력적인 언어였다. 최근에는 정규식 관련한 연산들 때문에 더 좋아하게 되었다. (링크 : http://mrhaki.blogspot.com/2009/09/groovy-goodness-matchers-for-regular.html) 나는 간단하게 데이터를 다루는 프로그램이나 데이터 관련한 전처리를 할 때 Groovy 스크립트를 자주 애용하고 있다. 그런데 이것의 단점은 Command Line 으로 실행이 잘 안되는 것이다. (뭔가 클래스패스 설정이 좀 꼬인듯 하다.) 이 문제는 언젠가 꼭 짚어보고 싶지만 바쁜 관계로 나중으로 미루고, 오늘은 차선책으로 Groovy 프로젝트를 실행가능한 jar 파일로 만드는 걸 해보았다. 메이븐으로 진행하였다. ..

JAVA 2018. 5. 31. 02:32
Spring Boot jar에서 war로 변경

프로젝트 JAR에서 WAR로 설정 변경 우선 프로젝트 설정을 jar에서 war로 바꾼다. pom.xml에서 packaging을 war로 바꾸고 tomcat을 provided로 바꾼다. war ... org.springframework.boot spring-boot-starter-tomcat provided ... ... 그리고 Application 클래스도 수정한다. 서블릿을 초기화하는 코드를 추가해야한다. SpringBootServletInitializer을 상속받고 configure 메서드를 아래처럼 재정의한다. @EnableWebMvc @SpringBootApplication public class Application extends SpringBootServletInitializer { @Over..

JAVA 2017. 11. 15. 02:21
자바 백앤드에서 canvas의 data URL 저장하기

캔버스에서 toDataURL()이라는 함수를 실행하면 data url이 나온다. base 64로 인코딩된 이미지라고 한다. (https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) 이 데이터 URL을 서버로 업로드해서 이미지 파일로 저장하는 방법에 대해서 아주 간단하게 정리해보려고 한다. 이거 하면서 쓸데없이 뻘짓을 많이 했는데 다른 분들이 바로 성공하시길. data:image/png;base64,을 제거하고 디코딩 import java.util.Base64; public class Base64Utils { private static final String BASE_64_PREFIX = "data:image/png;bas..

JAVA 2017. 5. 29. 00:01
AOP 구현 세가지 방법 비교에 관한 짧은 글 - JAVA proxy, CGLIB, AspectJ

AOP 구현 방법 비교 java에서 AOP를 구현하는데는 세가지의 방법이 있다. java proxy, cglib, aspectJ이다. 이번 포스팅에서는 세가지를 간단하게 비교해보고 개인적인 경험을 적어 두려고 한다. Java proxy (InvocationHandler) 런타임시에 Target method가 호출될 때 Advice(프록시 할 기능)을 적용 JDK Proxy는 인터페이스에 대한 Proxy만을 지원 Cglib (MethodInterceptor) java proxy와 동일하게 런타임시에 Advice 적용 메써드가 처음 호출 되었을때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용 클래스에 대한 Proxy가 가능 AspectJ Runtime이 아닌 Compile 시점에 Aspect를 ..

JAVA 2016. 10. 26. 18:19
Java Method Timeout - 자바 메서드 타임아웃 만들기 예제

특정 인프라가 불안정해서 때때로 오래 걸리는 메서드가 있다고 가정해보자.오래걸릴 경우는 무조건 이상 상황이다. 기다리지 않고 다음 일을 진행하는 것이 좋다.네트워크 단에서 문제를 해결하고 싶지만, 내가 그쪽 코드는 건드리지 못하는 상황에서 메서드에 타임아웃을 거는 방법이 있다. java.util.concurrent.ExecutorService, java.util.concurrent.Future 를 활용하는 방법이다. import org.junit.Test; import java.util.concurrent.*; public class ExecutorTest { @Test(expected = TimeoutException.class) public void executorTest() throws Except..

JAVA 2016. 9. 21. 13:19
한글-영어-특수문자 순 정렬하는 java compare 메서드 만들기

카톡을 보게 되면, 한글 -> 영문 -> 특수문자 순으로 정렬을 합니다. 지난 번 프로젝트 하면서 동일한 요구사항이 있었는데, 생각보다 머리아프더라고요. 그냥 문자열순으로 정렬하면 그 순서가 안나오니까요. 그래서 이번에 아스키 코드를 보면서 그걸 하나하나 확인하면서 작업을 했습니다. 우선은 해당 문자가 어떤 종류인지 알아야겠지요.그래서 그걸 확인하는 UTIL을 하나 만들었습니다. /** * 문자 관련 유틸 */ public class CharUtil { public static boolean isEnglish(char ch){ return (ch >= (int)'A' && ch = (int)'a' && ch = Integer.parseInt("AC00", 16) && ch =..

JAVA 2016. 4. 17. 03:29
[JAVA:reflection] 자바 프록시로 문제 해결하기!

사실 지난 번에 포스팅한 '[JAVA:reflection] typesafe하게 특정 메서드 객체 가져오기 ' 나 '[JAVA] 현재 실행중인 메서드 가져오는 방법' 은 내가 어떤 문제를 해결하기 위해서 찾다가 알게 된 것이었다.그 문제는 아래와 같다. 우리는 보통 데이터를 캐싱된 데이터를 가져오거나 입력할 때,1) 캐시 서비스 객체를 초기화하고, 2) 캐시키를 만들고, 3) 설정된 캐시팜에서 캐시키를 통해서 객체를 가져오고4) 객체가 NULL이면 실제 서비스 객체를 통해서 데이터를 가져오고5) 가져온 데이터를 캐시키에 맞게 캐시팜에 입력하고6) 가져온 데이터를 리턴하는 위와 같은 로직을 반복하고 있다. 이러한 중복되는 로직을 메서드로 추출하는 것이 문제이다. 문제를 해결하기 위해서 많은 고민을 해봤지만,..

JAVA 2015. 10. 26. 01:28
[JAVA:reflection] typesafe하게 특정 메서드 객체 가져오기

자바에서, java.lang.reflect.Method 클래스의 invoke 메소드를 써야할 경우들이 있습니다.그런데 보통 리플렉션을 통해서 메서드를 가져올 때 String 타입의 메서드 이름과 파라미터 클래스를 통해서 메서드 객체를 가져옵니다.이 방법의 단점은 문자열로 메서드를 검색하기 때문에 typesafe 하지 않다는 단점이 있습니다.(리펙토링을 해서 메서드의 이름이 바뀐다면, 에러가 나지는 않지만 그 기능은 사용할 수 없게 됩니다.) 그 단점을 극복하기 위해서 여러 방법을 찾아 보다가, MethodSelector라는 것을 알게 되었습니다.https://gist.github.com/stijnvanbael/5965609 public interface TestService { public TestBO ..

JAVA 2015. 10. 4. 22:24
[JAVA] 현재 실행중인 메서드 가져오는 방법

facebook javawocky 그룹에서 박성철님이 답변해주심 Method nowmethod = new Object(){}.getClass().getEnclosingMethod(); 현재 사용 중인 메서드에서 위처럼 무명 클래스를 만들고 getEnclosingMethod를 사용하면 현재 실행중인 메소드를 다른 방법들 보다 쉽게 가져올 수 있다.

JAVA 2015. 10. 4. 21:43
JSP 버퍼 플러시 후에 < jsp : foword > 한다면?

오늘 JSP(최범균님의 JSP2.2웹프로그래밍) 스터디 하다가 궁금한 점이 생겨서 테스트 해보았습니다. 책 222 쪽에는 버퍼가 없을 때는 액션 태그를 사용하면 에러가 발생하며, 또한 버퍼가 차서 버퍼의 내용이 웹 브라우저에 한번 전송한 이후에 액션 태그를 사용하는 경우에도 JSP 규약에 따라 에러가 발생한다고 나와있습니다. 과연 어떻게 에러가 날까요? 이렇게 코드를 작성했습니다. 버퍼의 크기는 1kb로 설정했어요. 그 다음에 반복문으로 "reimaginer"라는 문자열을 계속 출력하도록 했고요, 반복문이 끝난 이후에 액션 태그를 사용하여 같은 경로에 있는 foword.jsp로 이동하도록 구현했습니다. 그럼 결과는 ? 엥 잘 나오네요? 그런데 가만 보니 마지막에 "r"만 남아있습니다. 버퍼를 플러시 한 ..

JAVA 2015. 3. 5. 21:47
jsp application 기본 객체 범위 테스트

BACK TO THE BASIC!현재 웹 개발을 하고 있는 사람으로써 기초가 부족하다는 생각을 많이 했습니다.그래서 회사 내에서 스터디를 진행하고 있습니다. 책은 바로 '최범균' 님의 JSP2.2 웹프로그래밍입니다. 오늘 스터디 중에서 별거 아닌데 궁금한 게 있어서 공유합니다.과연 웹 애플리케이션에서 application 객체의 범위는 어떻게 될까요? 책 163p 아래에서 두번째 줄에 "jsp나 서블릿에서 하나의 웹 어플리케이션은 하나의 디렉토리에 매핑된다"고 한것 처럼 서로 다른 jsp에 있는 애플리케이션 객체는 다를까요? 아니면 책 189p 아래에서 두번째 줄에 있는 “모든 jsp는 한개의 애플리케이션 객체를 공유한다”는 말처럼 모든 jsp의 애플리케이션 객체는 같을까요? 테스트 해보았습니다. 우선,..

JAVA 2015. 3. 3. 21:24
(스프링에서) WAS는 어떻게 Controller를 생성하나요?

배포 후 문제가 발생했습니다. 문제 : 검색을 했는데 내가 보낸 키워드가 아닌 이상한 키워드로 검색이 된다. 원인 : Controller에서 자주 쓰이는 변수들을 클래스 변수(attribute)로 선언했는데 그게 critcal section이 되어서 여러 개의 쓰레드들이 그 변수들의 값을 변경하고 검색 작업의 무결성(동기화)이 깨졌다 . 해결책 : 검색 정보를 담은 value object를 새로 만들고 매소드 안에 지역변수로 선언하여 사용한다. 이번에 저는 검색 Controller의 500라인이나 되는 방대한 검색 메소드를 리펙토링 했습니다. 메소드를 추출해내고 자주 쓰이는 변수들은 클래스 변수로 만들었습니다. 그리고 메소드가 호출될 때마다 클래스 변수 초기화 메소드를 호출할 수 있도록 했습니다. 그런데..

JAVA 2014. 11. 1. 21:14
이전 1 다음
이전 다음
공지사항
  • 여행관련 컨텐츠 블로그를 분리했습니다.
최근에 올라온 글
  • 2022-10-26 앱푸시 관련 기능은 중요하다.
  • 2022 하반기 마이크로서비스 패턴 스터디 후기
  • 실용적 함수형 프로그래밍을 적용하기 위한 준비 -⋯
  • 쏟아지는 일 완벽하게 해내는 법 Getting T⋯
최근에 달린 댓글
  • 좋은정보 고맙습니다.
  • 회사에서 파싱머신 만드는데 잘 보고갑니다 감사합니다 ~⋯
  • 좋은 내용 감사합니다 : )
  • 추천코드도 써주시지 ㅋㅋ
Total
217,119
Today
2
Yesterday
69
링크
  • 다크 프로그래머
  • 자바캔(Java Can Do IT)
  • SING A SONG IT
  • cloe's story
TAG
  • container
  • spring
  • rest
  • 한달살기
  • sanur
  • hands-on
  • javascript
  • Clean code
  • ecma6
  • 컨테이너
  • 객체지향
  • AWSKRUG
  • 웹
  • AWS
  • Bali
  • springboot
  • 개발자
  • 도커
  • 웹을 지탱하는 기술
  • 발리
  • spring boot
  • Docker
  • ES6
  • S68
  • 회고
  • html
  • 실수노트
  • 사누르
  • JPA
  • 독후감
more
«   2023/02   »
일 월 화 수 목 금 토
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
글 보관함
  • 2022/11 (3)
  • 2022/02 (1)
  • 2022/01 (1)
  • 2021/07 (3)
  • 2021/05 (3)

Blog is powered by Tistory / Designed by Tistory

티스토리툴바