비즈니스 로직과 상관없지만 해야하는 일들이 있을 때, Spring 프레임워크에서 제공하는 Event를 사용하여 비즈니스 코드와 비즈니스와 관련 없는 코드의 의존을 분리한다. 예를 들어, 비즈니스 특정 행위를 로그 테이블에 적재해야 할 때, 나의 판단에는 비즈니스의 흐름에 로그 테이블에 적재하는 코드를 넣는 것은 비즈니스 흐름을 읽는 데 방해가 된다. 그래서 이벤트를 발생시키고 해당 이벤트의 Listener 객체가 해당 작업을 수행하도록 한다. 참고; https://javacan.tistory.com/entry/Handle-DomainEvent-with-Spring-ApplicationEventPublisher-EventListener-TransactionalEventListener 스프링 Applicat..
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..
최근에는 명령(Command)과 조회(Query) 모델을 분리해서 개발하고 있다. 그래서 JPA로 명령 모델에서 쓰이는 엔티티와 조회 모델에서 쓰는 엔티티를 따로 만든다. 그런데 생성, 삭제, 변경 류의 명령(command) 모델에서 생성된 쿼리들은 간단하고 식별하기 쉽지만, 조회 모델에서 Hibernate가 만든 복잡한 쿼리들은 이게 어떻게 실행된 쿼리인지 식별하기 어렵다. 현재 회사에서는 DBA가 가끔 슬로쿼리를 뽑아서 전달해 주는데, 해당 쿼리가 어디서 실행된 쿼리인지 찾는데 좀 오래걸린 경험이 있다. 그래서 조회용 쿼리에 주석을 붙여서 찾기 쉽게 해보려고 한다. 관련 코드는 아래 깃헙 링크에 있다. 코드는 코틀린으로 작성되어 있다. https://github.com/voyagerwoo/spring..
"함수형 사고"라는 책을 읽게 된 후 Groovy는 나에게 너무 매력적인 언어였다. 최근에는 정규식 관련한 연산들 때문에 더 좋아하게 되었다. (링크 : http://mrhaki.blogspot.com/2009/09/groovy-goodness-matchers-for-regular.html) 나는 간단하게 데이터를 다루는 프로그램이나 데이터 관련한 전처리를 할 때 Groovy 스크립트를 자주 애용하고 있다. 그런데 이것의 단점은 Command Line 으로 실행이 잘 안되는 것이다. (뭔가 클래스패스 설정이 좀 꼬인듯 하다.) 이 문제는 언젠가 꼭 짚어보고 싶지만 바쁜 관계로 나중으로 미루고, 오늘은 차선책으로 Groovy 프로젝트를 실행가능한 jar 파일로 만드는 걸 해보았다. 메이븐으로 진행하였다. ..
프로젝트 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..
캔버스에서 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..
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.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..
카톡을 보게 되면, 한글 -> 영문 -> 특수문자 순으로 정렬을 합니다. 지난 번 프로젝트 하면서 동일한 요구사항이 있었는데, 생각보다 머리아프더라고요. 그냥 문자열순으로 정렬하면 그 순서가 안나오니까요. 그래서 이번에 아스키 코드를 보면서 그걸 하나하나 확인하면서 작업을 했습니다. 우선은 해당 문자가 어떤 종류인지 알아야겠지요.그래서 그걸 확인하는 UTIL을 하나 만들었습니다. /** * 문자 관련 유틸 */ public class CharUtil { public static boolean isEnglish(char ch){ return (ch >= (int)'A' && ch = (int)'a' && ch = Integer.parseInt("AC00", 16) && ch =..
사실 지난 번에 포스팅한 '[JAVA:reflection] typesafe하게 특정 메서드 객체 가져오기 ' 나 '[JAVA] 현재 실행중인 메서드 가져오는 방법' 은 내가 어떤 문제를 해결하기 위해서 찾다가 알게 된 것이었다.그 문제는 아래와 같다. 우리는 보통 데이터를 캐싱된 데이터를 가져오거나 입력할 때,1) 캐시 서비스 객체를 초기화하고, 2) 캐시키를 만들고, 3) 설정된 캐시팜에서 캐시키를 통해서 객체를 가져오고4) 객체가 NULL이면 실제 서비스 객체를 통해서 데이터를 가져오고5) 가져온 데이터를 캐시키에 맞게 캐시팜에 입력하고6) 가져온 데이터를 리턴하는 위와 같은 로직을 반복하고 있다. 이러한 중복되는 로직을 메서드로 추출하는 것이 문제이다. 문제를 해결하기 위해서 많은 고민을 해봤지만,..
자바에서, java.lang.reflect.Method 클래스의 invoke 메소드를 써야할 경우들이 있습니다.그런데 보통 리플렉션을 통해서 메서드를 가져올 때 String 타입의 메서드 이름과 파라미터 클래스를 통해서 메서드 객체를 가져옵니다.이 방법의 단점은 문자열로 메서드를 검색하기 때문에 typesafe 하지 않다는 단점이 있습니다.(리펙토링을 해서 메서드의 이름이 바뀐다면, 에러가 나지는 않지만 그 기능은 사용할 수 없게 됩니다.) 그 단점을 극복하기 위해서 여러 방법을 찾아 보다가, MethodSelector라는 것을 알게 되었습니다.https://gist.github.com/stijnvanbael/5965609 public interface TestService { public TestBO ..
오늘 JSP(최범균님의 JSP2.2웹프로그래밍) 스터디 하다가 궁금한 점이 생겨서 테스트 해보았습니다. 책 222 쪽에는 버퍼가 없을 때는 액션 태그를 사용하면 에러가 발생하며, 또한 버퍼가 차서 버퍼의 내용이 웹 브라우저에 한번 전송한 이후에 액션 태그를 사용하는 경우에도 JSP 규약에 따라 에러가 발생한다고 나와있습니다. 과연 어떻게 에러가 날까요? 이렇게 코드를 작성했습니다. 버퍼의 크기는 1kb로 설정했어요. 그 다음에 반복문으로 "reimaginer"라는 문자열을 계속 출력하도록 했고요, 반복문이 끝난 이후에 액션 태그를 사용하여 같은 경로에 있는 foword.jsp로 이동하도록 구현했습니다. 그럼 결과는 ? 엥 잘 나오네요? 그런데 가만 보니 마지막에 "r"만 남아있습니다. 버퍼를 플러시 한 ..
BACK TO THE BASIC!현재 웹 개발을 하고 있는 사람으로써 기초가 부족하다는 생각을 많이 했습니다.그래서 회사 내에서 스터디를 진행하고 있습니다. 책은 바로 '최범균' 님의 JSP2.2 웹프로그래밍입니다. 오늘 스터디 중에서 별거 아닌데 궁금한 게 있어서 공유합니다.과연 웹 애플리케이션에서 application 객체의 범위는 어떻게 될까요? 책 163p 아래에서 두번째 줄에 "jsp나 서블릿에서 하나의 웹 어플리케이션은 하나의 디렉토리에 매핑된다"고 한것 처럼 서로 다른 jsp에 있는 애플리케이션 객체는 다를까요? 아니면 책 189p 아래에서 두번째 줄에 있는 “모든 jsp는 한개의 애플리케이션 객체를 공유한다”는 말처럼 모든 jsp의 애플리케이션 객체는 같을까요? 테스트 해보았습니다. 우선,..
배포 후 문제가 발생했습니다. 문제 : 검색을 했는데 내가 보낸 키워드가 아닌 이상한 키워드로 검색이 된다. 원인 : Controller에서 자주 쓰이는 변수들을 클래스 변수(attribute)로 선언했는데 그게 critcal section이 되어서 여러 개의 쓰레드들이 그 변수들의 값을 변경하고 검색 작업의 무결성(동기화)이 깨졌다 . 해결책 : 검색 정보를 담은 value object를 새로 만들고 매소드 안에 지역변수로 선언하여 사용한다. 이번에 저는 검색 Controller의 500라인이나 되는 방대한 검색 메소드를 리펙토링 했습니다. 메소드를 추출해내고 자주 쓰이는 변수들은 클래스 변수로 만들었습니다. 그리고 메소드가 호출될 때마다 클래스 변수 초기화 메소드를 호출할 수 있도록 했습니다. 그런데..
- Total
- Today
- Yesterday
- 도커
- Clean code
- AWS
- 실수노트
- 발리
- javascript
- spring boot
- Bali
- rest
- spring
- html
- sanur
- 객체지향
- 사누르
- 웹
- 한달살기
- Docker
- 웹을 지탱하는 기술
- ChatGPT
- ES6
- 회고
- AWSKRUG
- 컨테이너
- container
- 개발자
- S68
- 독후감
- springboot
- ecma6
- hands-on
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |