일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 리눅스
- 파이썬 소스
- 오라클
- 알고리즘
- smart cast
- K6
- 자바 프로젝트
- 초대장
- hyperledger
- spring
- 유사코드
- dynamic query
- 프로젝트
- 운영체제
- 학점
- MongoDB
- jsp
- 백준 알고리즘
- 파이썬
- 문법 정리
- auto configure
- 오라클 디비
- 티스토리
- oracle
- c#
- gradle
- JVM
- resilience4j
- SQL
- Today
- Total
목록목차 (231)
모종닷컴
코틀린 코드를 리팩토링하면서 만났던 에러를 공유합니다. 환경은 아래와 같습니다. kotlin + Spring Boot (2.2.13.RELEASE) kotlin allopen plugin 적용 spring-boot-starter-web 의존 추가 위에도 필요한 의존성이 있을 수 있습니다.. 이슈 같은 로직을 가지고 있지만 때에 따라 조금씩 다른 부분들이었고 앞으로도 재사용 가능성이 있는 코드이기에 이를 추상화시켜 재사용하는 것이 저의 목표였습니다. 따라서 공통적인 부분들을 모아 추상클래스를 아래와 같은 형태로 리팩토링을 하였는데요. private val log = KotlinLogging.logger { } abstract class EvaluationService { @Autowired private ..
지난글에서 쿼리를 수정함으로써 아주 굉장한 효과를 보았습니다. 하지만 만족하지 않습니다. 고민 : 작업을 왜 하나의 스레드로만 하고 있었을까? 지금까지 Batch Update의 1편, 2편 모두 잘 보았더라면 결국 저희가 하고 있는 코드는 id가 1 ~ 1,000,000 인 데이터 행들을 일괄적으로 업데이트하는겁니다. 그렇다면 이런 생각을 해볼 수 있습니다. 왜 내가 이걸 스레드 하나로 돌리고 있어야 할까?? 여러 개의 스레드를 이용해서 각각 범위를 나누어 실행시키면 더 빠르지 않을까 하고 말이죠. 예를 들면 1~ 10000 은 스레드1이 담당하고 10001 ~ 20000는 스레드2가 담당하도록 한다면 동일한 행을 참고할 일도 없으니 여러 개의 스레드로 나누어서 실행해도 문제없을 것 같습니다. 일단 해보..
고민을 너무 많이 했나봅니다. 글이 너무 길어져서 지난 글에 이어 2편으로 다시 돌아왔습니다. 지난 글에서는 메모리와 JPA에 대한 고민을 위주로 글을 썼었더라면 이번 편에서는 데이터베이스와 관련된 고민들을 나열해보았습니다. 고민1 : 쿼리 횟수에 대한 고민 다음으로 고민했던 부분은 쿼리의 횟수였습니다. 분명 지난번 rewriteBatchedStatements 설정을 통해 쿼리가 나가는 횟수를 여러개에서 한번으로 줄였는데 무슨 또 쿼리 횟수를 고민하냐라고 하실수 있습니다. 하지만 그것과는 별개로 다른 문제가 있습니다. 1000개의 쿼리를 한번에 보냄으로써 여러 번 네트워크를 타거나 쿼리를 보내기 위한 과정을 줄일 수 있었지만 1000개의 쿼리를 한번에 보냈다 해서 데이터베이스에서 쿼리를 한번 실행시키는게..
650만건 정도의 데이터를 일괄로 업데이트해야 하는 상황이 생겼습니다. 이 과정에서 고민했던 부분들과 그 고민들을 어떻게 해결하였는지를 간단하게 글로 남겨 공유를 드리려고 합니다. 글을 쓰기 이전에 아래와 같은 의문이 들수도 있을것 같아 문답 형식으로 남겨놓았습니다 :) 왜 코드를 통해 일괄 업데이트를 진행하였나요? 처음에는 sql을 이용하여 일괄 업데이트 할 계획이었지만, 해당 컬럼을 세팅하기 위해서는 여러 비즈니스 로직들이 들어가게 되면서 sql 만으로는 업데이트 하지 못하는 상황이었습니다. 스크립트 언어를 사용하였나요? 저희 회사에서는 spring boot + kotlin을 주력으로 프로젝트를 구성하고 있습니다. 물론 스크립트 언어를 이용하여서도 가능은 할 수 있었지만 여러 비즈니스 로직들을 다시 ..
요청에서 이에 대한 응답을 내려주기 까지의 과정을 그림으로 그려서 이해해보고자 했다. 내가 알고있었던 보통의 과정들은 다음과 같았다. 이 과정에서 각각 어떤 과정을 거치면서 요청이 가는지 간단하게 사진을 나타내보았다. ①- dns, router, tcp/ip ② - 로드밸런싱(다중 서버일 때 요청이 적절하게 분배될 수 있도록 한다.) ③- 웹 컨테이너를 거치지 않고 정적 컨텐츠를 리턴( js, html, css, font 등등)- 동적컨테이너가 요구될 때 was(웹 컨테이너)에 전달 ④ - jsp,servlet을 실행시킬수 있는 소프트웨어이다.- web.xml(Deployment descripter)로부터 서블릿을 검색- HttpServletRequest, HttpServletResponse객체를 만들어..
■용어 Rendering SSR : Server Side Rendering - 서버 측에서 HTML로 렌더링하여 준 자원을 브라우저가 표시CSR : Client Side Rendering - 일반적으로 DOM을 사용하여 브라우저에서 렌더링을 한다.Performance TTFB : Time to First Byte - 링크를 클릭 후에서부터 첫 번째 바이트를 받기까지의 시간FP : First Paint - 픽셀이 처음으로 사용자에게 표시되는 시간FCP : First Contentful Paint - 요청한 컨텐츠가 보이게 되는 시간TTI : Time To Interactive- 페이지가 대화형으로 전환되는 시간 ■ SSR(Server Side Rendering) 서버사이드 렌더링은 서버 측에서 리소스 + ..
서버로부터 HTML를 받아온 브라우저가 이를 어떻게 해석하여 화면에 표시하는지 과정을 알고 싶어서 찾아보았다. 이 글은 https://d2.naver.com/helloworld/59361과 https://dzone.com/articles/behind-browser-basicspart-1를 정리하여 작성한다. ■브라우저의 기능브라우저는 웹 리소스(HTML, CSS, XML, JS, JSON, PDF 등등)을 화면에 그리는 기능을 한다. 일반적으로 리소스의 위치를 사용자가 URI를 통해 사용함으로 브라우저는 서버에게 요청을 하고 서버는 이에 대한 응답을 정보들을 준다. ■브라우저의 구성 요소 1. 사용자 인터페이스 - 일반적으로 우리가 바라보는 브라우저의 모습이다. (뒤로가기 버튼, 새로 고침 버튼, 주소 ..
■커스터마이징 버튼 만들기 프로젝트 내에서 fullcalendar를 사용하게 되었다. 뷰 모드는 agenda로 다음 날짜 혹은 이전 날짜 버튼을 클릭했을 때 특별한 작업을 하고 싶었다. 일단 기존의 prev, next 버튼에 이벤트를 추가하고 싶었으나 정보를 제대로 찾지 못해서 커스터마이징된 버튼으로 대체 하기로 하였다. ■Calendar에 동적으로 데이터 추가하기 작성한 updateTime는 calendar에 events(데이터)를 추가하는 것이다. calendar에 데이터를 추가하는 방법은 다음과 같이 호출하면 된다. * 배열의 경우$('#calendar').fullCalendar('renderEvents',데이터배열,영구데이터) * 배열이 아닌 객체의 경우$('#calendar').fullCalen..
인증이 되어있지 않은 사용자는 스프링 시큐리티의 필터링에 걸려 로그인 페이지로 향하게 된다. 나의 경우 처음에는 로그인을 성공했을 때 핸들러를 통해(SimpleUrlAuthenticationSuccessHandler를 상속받아 작성) 메인페이지로 돌아가게끔 URL을 지정하였다. 그렇다면 메인페이지말고 내가 로그인 페이지로 넘어가기전에 요청했었던 url로 넘어가고 싶다면 어떻게 해야 할까? 보통 다른 방법들을 찾아보았을 때 login페이지 컨트롤러에서 Session 값을 넣거나 하는 작업을 하는 것들을 보았는데, 사실 우리는 그럴필요가 없다. 레퍼런스에서 발견한 내용인데 두번째 문단을 읽어보면 인증전의 요청을 세션에 저장하고 있다고 얘기한다.그리고 세션에 저장되어 있는 속성의 이름은 SPRING_SECUR..
분할 정복 알고리즘이란 문제에 대한 답을 재귀 호출을 이용해 계산하고, 각 부분 문제의 답으로부터 전체 문제의 답을 계산해 낸다. 재귀 호출과 차이점은 이 부분 문제를 나누는 방법에 있어 재귀 호출은 작은 부분하나씩 분리해서 해결하지만, 분할 정복은 항상 비슷한 크기의 부분으로 나눈다는 것 분할 정복을 사용하는 알고리즘들의 세 가지 구성 요소문제를 더 작은 문제로 분할하는 과정각 문제에 대해 구한 답을 원래 문제에 대한 답으로 병합하는 과정더이상 답을 분할하지 않고 곧장 풀 수 있는 매우 작은 문제 분할 정복을 이용한 문제1) 1~n까지의 합을 구하여라재귀 함수를 이용하여 1~n 까지의 합을 구했을 때는 O(n) 시간 복잡도였지만분할 정복을 이용한다면 O(log n) 까지 줄일 수 있다. 2)행렬의 거듭..