지금 회사에선 웹앱개발시 jre8 에 spring boot 2.2.12를 사용하고 있다. 시대가 흘러서 LTS 도 종료(사실 원래 1년이긴하다)되고, Azure의 최신 API 지원을 받기도 곤란한 상황이 되어서 결국 업그레이드 결정이 내려졌다. 업그레이드가 결정난 시점에 3.2.2가 최신이어서 그걸 적용하기로 했다. 변경해야할 것들이 굉장히 많다. java8 → java17 변경 pom.xml 수정 javax → jakartaee로 패키지 변경. 톰캣 버전 변경 각종 maven artifiact 버전 변경 httpclient, junit artifact "교체" spring boot 자체의 메이저 버전 변경사항도 있고, 일부 API 지원중단 등 java의 하위호환성이 일부 손실되었기 때문에 위 변화를 적..
타임리프는 스프링 부트의 기본 View 템플릿이다. 일반적으로 Controller에 view를 매핑해주는 방법으로 사용한다. 그러나 개발을 하다보면 코드 내에서 타임리프를 파싱해서 사용하고 싶을 때가 있다. 예를 들어, 스케쥴러 내에서 타임리프로 만든 페이지를 이메일로 발송한다든지 등의 용도가 있다. 그런 경우에 타임리프를 코드 내에서 받아오는 방법에 관한 것이다. 가장 단순한 형태의 타임리프 파서는 아래처럼 만들 수 있다. (참고로 여기에 나오는 Context 객체는 org.thymeleaf.context 패키지 내의 Context 객체이다.) thymeleaf 3.0.6.RELEASE API www.thymeleaf.org public String getTemplate(SpringTemplateEng..
멀티스레드로 요청을 보낸 횟수를 db에 기록해 집계를 할일이 있어서 비관적 락에 대해 좀 살펴보았다. 내가 궁금했던것은 @Lock(LockModeType.PESSIMISTIC_WRITE) 을 어디에 달아주냐였다. 답은 "SELECT 쿼리를 호출하는 메서드" 였다. public interface StatRepository extends JpaRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) StatEntity findStatEntityById(Long id); Optional findyById(Long id); } 인터넷 예시들을 보면 jpql 같은걸 쓰기도 하는데, 그럴 필요 없이 기본 method에선 해당 메서드는 transaction 안에서만 사용해야 한다. ..
msal4j 도입중에 NoSuchMethodError가 발생했다. 원인은 azure keyvault, spring boot, msal4j에서 사용하는 api가 충돌했기 때문이다. 다행히 스프링부트 앱에 복잡한 기능이 없어서 spring boot 버전을 올려서 무난하게 해결할 수 있었다. 본인의 경우엔 jackson과 netty-common에서 충돌이 났었는데, 메서드나 클래스명이 자주 바뀌어서 버전이 변경되면 참조할 메서드와 클래스가 사라지는게 문제다. 스프링 버전과 각 api의 버전을 잘 체크해서 사용하는 수밖에 없다. https://docs.microsoft.com/en-us/azure/developer/java/sdk/troubleshooting-dependency-version-conflict T..
azure에서 cdn management를 위한 api를 제공한다. https://docs.microsoft.com/ko-kr/java/api/overview/azure/cdn?view=azure-java-stable Azure CDN libraries for Java Reference documentation for the Java CDN management libraries docs.microsoft.com 해당 문서만 봐선 사실 어떻게 사용해야하는지 막막한게 사실이다. pom.xml을 아래와 같이 추가한다. com.microsoft.azure azure-mgmt-cdn 1.41.1 com.microsoft.azure azure-client-authentication 1.7.13 purge를 하는 코..
https://jongqui.tistory.com/26 azure cdn purge CDN purge는 CDN의 캐싱을 삭제해주는 기능이다. 앞단에서 CDN을 사용하고 있었지만, 기존에는 png, jpeg 등 파일만 관리했고, azure blob storage에 파일이 올라가면, 파일 경로와 파일명이 무조건 새로 설 jongqui.tistory.com 위 포스팅에선 adal4j로 ouath2 token을 가져와 cdn purge를 하는 법을 설명했다. 위 포스팅 본문에 adal4j 지원 중단 사실과, msal4j를 이용하면 좋을거같다고 해놓고, 그 이후로 포스팅이 없었다. 이번엔 msal4j로 access token을 가져오는 법을 설명한다. pom.xml에 아래를 추가한다. com.microsoft.a..
CDN purge는 CDN의 캐싱을 삭제해주는 기능이다. 앞단에서 CDN을 사용하고 있었지만, 기존에는 png, jpeg 등 파일만 관리했고, azure blob storage에 파일이 올라가면, 파일 경로와 파일명이 무조건 새로 설정되었기 때문에, cdn에서 요청이 들어올 때 새로 업로드한 파일에 대해선 blob에서 이미지를 캐싱했기 때문에 아무 문제가 없었다. 그래서 전임자가 azure에 쉽게 업로드할 수 있게 만들어놓은 API를 그대로 썼다. 이번 이슈는 XML 파일을 수정하는 것이 새로 추가되었다는 것이다. blob에서 파일이 수정되는 경우엔 cdn에서 캐시 리로드 주기가 되기 전에는 검사를 따로 안하기 때문에, 즉시 반영이 안되는 문제가 있다.(하지만 즉시 반영이 되어야 했다.) 예제코드 등을 ..
회사에서 azure를 사용중인데, 릴리즈 준비중인 prod 서버에서 특이한 문제가 발생했다. (아래 내용은 모두 실제상황과 유사하게 "재현" 및 "각색" 된 것임을 밝힌다.) 스프링 부트 앱에서 google oauth2 인증시에 아래와 같은 에러가 발생했다. 검색해보니 private IP로 접근해서 ouath2 인증이 제대로 되지 않는 이슈였다. 하지만, 난 사내 dns를 통해 url을 입력해 서버에 접근했고 당연히 내부 ip가 사용되면 안되었다. 개발자 툴로 확인해보았다. (보안상 이유로 key값은 모두 지웠다.) Location header 내 쿼리스트링의 "redirect_uri" 의 값에 내부 ip가 찍히고 있었다. 당시에 사내 oauth2 sso 개발자가 휴가 중이었어서 몰랐지만, 로그인 성공후..
이클립스로 javaEE 어플리케이션을 개발하다보면, 가끔 의도적으로든, 실수로든 실행중인 jar 파일을 삭제하거나 교체하는 경우가 있다. 놀라운 것은 이때의 동작이 HP-OS, linux, Windows의 동작이 모두 다르다는 것이다. 일단 윈도우즈 먼저 살펴보자. 윈도우즈는 어떤 파일을 삭제하기 굉장히 까다롭다. 어떤 프로세스가 read lock을 파일에 걸게 되면, 운영체제가 파일락을 걸어버린다. 그리고 삭제할 때, 삭제가 되지 않도록 한다. 가장 대표적인 예가 토렌트와 악성코드가 있다. 토렌트에서 배포중이거나, 다운로드를 받고 있는 파일을 토렌트가 아닌 윈도우 창에서 삭제하려고 하면 삭제가 되지 않는 경험이 있을 것이다. 혹은, 어떤 파일이 악성코드에 감염되었는데, 해당 파일을 삭제하려고 하니, 삭..
고객사에서 웹로직에서 제우스로 전환하는데 아래와 같은 상황에 대한 버그 리포트가 있었다. filter에서 request.getParameter()를 호출. filter는 /* 로 매핑이 되어있어 무조건 타게 되어 있음. servlet에서는 request.getInputStream()을 호출. 이런 상황에서 request.getInputStream()에서 read()를 하는 경우 EOF가 떨어진다는 것이었다. 왜 이런 상황이 벌어졌는지 알려면 서블릿 스펙과 서블릿에서 요청을 읽어들이는 방법에 대해 알아야 한다. 크게 3가지 방법이 쓰인다. HttpServletRequest#getInputStream() HttpServletRequest#getReader() HttpServletRequest#getParam..
- Total
- Today
- Yesterday
- n+1
- 오블완
- Thymeleaf
- 부가가치세
- 현금영수증
- Spring
- Java17
- Azure
- 전세사기
- ouath2
- 안전신문고
- springboot3
- java
- 공익제보단
- 이륜차
- k베뉴
- tomcat
- 포상금
- ORM
- 토스페이
- 티스토리챌린지
- 탈세
- 홈택스
- 알리익스프레스
- JPA
- 한국교통안전공단
- Request
- 알리
- springboot
- 광군제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |