전체 글 16

하이버네이트 배치와 기본키 생성 전략

배치에 관한 공부를 진행하다, 간단한 설정만으로 하이버네이트 배치를 활용해 여러 개의 insert 쿼리를 모아 한 번에 처리할 수 있다는 사실을 알았다. 하이버네이트 배치를 사용하면 여러 개의 쿼리를 한번에 모아서 처리하기 때문에 단건씩 쿼리를 수행할 때에 비해 DB와 통신하는 횟수가 줄어들고, DB에서도 락을 잡는 횟수가 줄어들어 실행속도가 향상된다. 설정은 다음과 같다. batch_size에 한꺼번에 insert/update를 실행할 크기만큼 설정하면 된다. applicaiton.yml spring: jpa: properties: hibernate: jdbc: batch_size:100 하지만 조금 더 조사해본 결과 크리티컬하게 주의해야 할 점을 발견했다. 하지만 조금 더 조사해본 결과 현재 프로젝트..

트랜잭션 커밋 단위 축소 - @Transactional

들어가며 @Transactional을 주의깊게 보게 된 계기는 배치 서버의 데이터 업데이트 때문이었다. 일별로 업데이트 해야 하는 데이터의 양이 증가하게 되면서, 스케쥴러들의 실행 시간이 겹치게 되었다. 이전에는 3:00AM, 4:00AM 등 한 시간 간격으로 스케쥴러 시간을 설정하였어도 충분히 스케쥴러를 겹치지 않게 돌릴 수 있었다. 하지만 데이터의 양이 증가하며 스케쥴러 실행 시간이 한시간이 넘어가게 되며 문제가 시작되었다. 여러 스케쥴러들의 실행 시간이 겹치고, 겹치게 실행되는 스케쥴러들이 동일한 DB table을 업데이트 하려다보니 업데이트 중 table lock이 걸려 timeout에러를 자주 맞이하게 되었다. table lock 이슈 때문에 timeoutException이 발생하는 이유는 트랜..

[Java] 자바 클래스(Class) 상속

상속이란? 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 속성과 기능을 이용할 수 있다. 구조도를 그릴 경우, 자식클래스가 부모 클래스를 가리키는 형태로 표기된다. public class ParentClass { public ParentClass() { } public void parentFun() { System.out.println("parentfun"); } } public class ChildClass extends ParentClass { public ChildClass() { } public void childFUn() { System.out.println("childFun"); } } 위와 같이 extends 를 활용하여 ChildClass에 ParentClass를 상속한다. 그러면 아..

[Java] 클래스(Class) 구현하기 - 멤버변수, 생성자, 메서드, this

클래스의 기본 구조 클래스는 멤버 변수 (속성), 메소드 (기능), 생성자로 구성된다. 이 중, 생성자는 메모리에 객체를 생성하는 역할을 한다. public Grandeur() { } 기본 생성자는 위의 코드와 같이 생겼다. 메소드 이지만 대문자로 시작하고, 클래스명과 같은 명칭을 쓴다는 것이 다른 메소드와 생성자와의 차이이다. Grandeur car = new Grandeur(); 위와 같은 형태로 메모리 내에 객체가 생성되고, car라는 인스턴스가 생기는데 이때 객체를 생성하기 위한 메소드로 사용하기 위해 만들어진 것이 기본 생성자이다. 기본 생성자에서 좀 더 발전된 형태의 생성자를 중복 형성하는 것도 가능하다. (자바 클래스 내에서는 이름은 같으나 매개변수의 개수 또는 타입이 다른 중복 메소드를 만..

우리는 왜 스프링을 사용하는가? - Java spring의 특징

앞선 글에서 왜 우리가 프레임워크를 사용해야 하는 지 알아보았다. 짧게 짚고 넘어가자보자. 결국 개발자 입장에서는 검증된 코드를 이용해서 최소한의 부분만 바꾸어 빠르게 개발하기 위해서이며, 회사 입장에서는 누구에게 개발을 맡기던 일정 수준 이상의 결과물을 기대할 수 있기 때문이다. 그렇다면 Spring(Java), Django(Python), Flask(Python), Ruby on rails(Ruby), .NET Framwork 등 수많은 프레임워크 중 Spring은 어떤 장점이 있길래 사람들이 사용하는 것일까? 그렇다면 프레임 워크 중에서 왜 자바 스프링인가? 스프링은 여러 프레임워크들 중 자바(Java)를 기반으로 하는 프레임워크이다. 우선, 자바 스프링의 특징부터 알아보자. 이러한 특징들 덕분에 ..

우리는 왜 프레임워크를 사용하는가? - Framework & Library

"우리는 왜 자바 스프링을 사용하는가?" 라는 질문에 대답하기에 앞서 선행되어야 할 대답이 있다. 그것은 바로 "우리는 왜 프레임워크를 사용하는가?"라는 질문에 대한 대답이다. 결국, 스프링도 자바라는 언어를 활용해 만들어진 프레임워크이기 때문이다. 우선, 우리가 프레임워크를 왜 사용하는 지 대답하기에 앞서 Framework와 Library 각각을 알아보고, 이 둘의 차이까지 한번 알아보겠다. Framework 프레임워크는 뼈대나 기반 구조를 뜻하고, 제어의 역전 개념이 적용된 대표적 기술이다. 소프트웨어에서의 프레임워크는 '소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합'이라 할 수 있다. 완성된 어플리케이션은 아니기에 프로그래머가 완성시키는 작업을 해야 한다. 객체 ..

객체 지향 프로그래밍 with Java

01. Java 문법을 활용해 정의하는 객체 지향 프로그래밍 Procedure Programming(절차 지향 프로그래밍)은 메소드를 이용해 작은 부품을 만들고, 이를 결합해 더 큰 프로그램을 만들어가는 것이다. 몇몇 컴퓨터 엔지니어들은 method만으로 프로그램을 만들어 나가는 것에 부족함을 느꼈습니다. 그래서 프로그래머들은 서로 연관된 변수들과 메소드들을 모아서 그룹핑하고 거기에 이름을 붙여 정리 정돈을 하고 싶어졌다. 그래서 만든 수납상자가 Class이다. Class를 중심으로 프로그램의 구조를 만들어 가는 컴퓨터 프로그래밍 방법론을 Orbject Oreiented Programming(객체지향 프로그래밍)이라 한다. 02. 남의 프로젝트와 남의 인스턴스 import java.io.FileWrite..

객체 지향 프로그래밍 (Object Oriented Programming)

01. 객체 지향 프로그래밍이란? 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것이다. "객체"라고 했다고 너무 추상적으로 받아들이지 말고 다음에 집중해라. 객체를 어떻게 만드는가? 객체를 어떻게 사용하는가? 하나의 프로그램은 서로 다른 목적을 가진 로직들의 집합이다. 자연스럽게 복잡한 로직들을 기능별로 Grouping 하고 싶어질 것이다. 게시판으로 치면 글목록, 본문, 댓글 관련한 로직들을 각각 분류해서 모아놓는 식으로 말이다. 여기서 로직이란 변수와 메소드를 말하는 것이다. 변수와 메소드를 서로 연관되어 있는 기능별로 Grouping 하는 기능을 프로그래밍 언어 차원에서 제공하고 있고, 그렇게 Grouping 된 하나하나의 단위들을 "객체"라 부른다. 객체는 변수와 메소드..

나의 알고리즘 공부 여정8 - 마지막 편, 회고

20210317_TIL 알고리즘 문제를 집중적으로 다루어 보는 기간이 끝났다. 3월 5일부터 14일간 알고리즘의 바다에 풍덩 빠져있었다. 아직 만족할 만큼 알고리즘 문제를 막힘없이 풀어내지는 못하지만, 짧은 기간안에 알고리즘을 유형별로 흩어보고 풀이 경험을 쌓을 수 있었기에 의미 있는 시간이었다. 하루 하루 문제를 풀어나가면서, '내가 늘고 있는게 맞나?'라는 생각이 드는 날들도 있었지만 3월 5일 TIL 글을 읽고 바로 깨달았다. 2주 전에 비해 알고리즘 실력이 엄청나게 늘었다는 사실을.... 입력을 어떻게 받는지도 몰랐던 내가 자료구조와 알고리즘 문제들의 유형별 풀이를 전반적으로 익히고 적용하는 수준으로 성장했다. 특히, 1주차에 이해가 안되서 그냥 넘어간 문제들을 2주차에 다시 보니 쉽게 이해가 되..

나의 알고리즘 공부 여정7 - 최적해 알고리즘

20210317_TIL 동적계획법(이하 DP), 분할정복, 그리디 알고리즘 문제들을 풀었다. 상황별로 그에 맞는 최적해 알고리즘을 적용해보면서, 최적해 알고리즘을 잘 풀기 위한 경험을 쌓았다. 최적해 알고리즘 문제들을 여러 유형 접해보며, DP적 사고, 분할정복적 사고, 그리디 알고리즘적 사고 등을 연습 중이다. 상황별로 '최적'의 값을 도출해야하기 때문에 이전에 소개했던 탐색 알고리즘보다 문제가 조금 까다로운 측면이 있다. 최적의 값을 도출하기 위해 고려해야 할 상황들을 구성하고, 그 상황 별로 도출되는 결과값들을 모두 계산해야 하기 때문이다. 1. 최적해 알고리즘 분류 오늘 소개할 알고리즘은 최적해 알고리즘이다. 이름 그대로 '최적값'을 도출할 때 쓴다. 최적해 알고리즘 종류는 다음과 같다. 모든 상..