[Java] 일급 컬렉션(First Class Collection)이란?
·
Teck Stack/Java
개요우테코 프리코스를 진행하면서 클린 코드 원칙을 준수해야 했습니다. 그중에서 "컬렉션에 대해 일급 컬렉션을 적용했는가?"라는 항목이 존재했고, 처음 들어보는 단어였기에 관심을 갖게 되었습니다. 일급 컬렉션은 소트웍스 앤솔로지의 객체지향 생활 체조 원칙에서 언급된 단어입니다. 일급 컬렉션이 무엇인지 그리고 언제 사용하면 좋을지 알아보겠습니다. 일급 컬렉션일급 컬렉션은 컬렉션을 Wrapping 하면서, 컬렉션 이외의 다른 멤버 변수를 가지지 않는 클래스를 의미합니다. 컬렉션을 단순히 데이터 보관용 객체로 두지 않고, 하나의 객체로 추상화해 책임을 부여한 클래스입니다. 컬렉션을 클래스로 포장하여 책임을 갖기 때문에 컬렉션에 대한 비즈니스 로직을 내부에 작성하고 관리할 수 있습니다. 예시를 들어보겠습니다..
[JAVA] Static은 언제 사용할까?
·
Teck Stack/Java
Staticstatic 키워드를 사용한다는 것은 프로그램이 시작될 때 메모리에 한 번 할당되고 프로그램이 종료될 때 해제되는 것을 의미합니다. static 키워드는 변수와 메소드에 선언할 수 있습니다. 정적 변수 사용 예시public class Cat { private static final String SOUND = "meow"; public void sound() { System.out.println(SOUND); }} 정적 메소드 사용 예시public class Cat { public static void sound() { System.out.println("meow"); }}//사용Cat.sound();정적 메소드는 객체를 생성하지 않고 클래스명..
[Java] Error와 Exception
·
Teck Stack/Java
자바에서는 Error(오류)를 Error(오류)와 Exception(예외)로 나눌 수 있습니다. Error (오류)시스템이 종료되어야 할 수준과 같이 수습할 수 없는 심각한 문제개발자가 미리 예측하여 방지할 수 없다.Exception (예외)개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생개발자가 방지 가능하다. 오류는 발생시점에 따라 컴파일 오류와 런타임 오류로 나눌 수 있다. Compile Error (컴파일 오류)소스코드를 컴파일하는 과정에서 발생하는 오류이다.컴파일러가 코드를 읽고 바이트코드(. class)로 변환하는 과정에서 발견된다.오타나 구문 오류, 선언되지 않은 변수, 함수 혹은 클래스 등을 사용한 경우에 발생한다.Runtime Error (런타임 오류)소스코드 컴파일은 정..
[Java] JVM의 구조
·
Teck Stack/Java
JVM (Java Virtual Machine)JVM은 자바 가상 머신의 약자입니다. 이는 Java의 바이트 코드를 실행하는 역할을 담당합니다. JVM은 소프트웨어로서, 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공합니다. 자바 프로그램을 소스 파일(. java)로 작성하고, 자바 컴파일러는 소스 파일을 컴파일하여 바이트 코드(. class)를 생성합니다. 변환된 바이트 코드는 기계어가 아니므로 OS에서 바로 실행될 수 없습니다. 이때 JVM이 Java와 OS사이에서 중개자 역할을 수행하여 OS가 바이트 코드를 이해할 수 있도록 도와줍니다. JVM 구조 Class Loader (클래스 로더)JVM이 실행 중 필요한 클래스를 동적으로 메모리에 올려 실행할 수 있게 해주는 역할입니..
[Java] Stream API와 for-loop의 성능 차이
·
Teck Stack/Java
개요저는 간단한 알고리즘 문제 해결 시에는 Stream API를 적용해 본 경험이 있지만,프로젝트를 하다 보면 내부 구현이 복잡해져서 Stream API를 적용하지 못하고 for-loop를 사용해서 해결하곤 합니다. 그런데 실무에서는 Stream을 사용하여 가독성 있는 코드를 작성하는 경우가 있다고 하여, 프로젝트에 적용해 보려고 했습니다. 하지만 for-loop보다 Stream API를 사용했을 때 성능이 떨어질 수 있다는 포스트를 읽게 되어, 실제로 Stream API 사용이 성능에 영향을 미칠 수 있는지 확인해 보고자 했습니다. Stream APIStream API는 JDK 8부터 지원되는 기능으로 데이터 컬렉션을 함수형 방식으로 조합하여 원하는 결과를 필터링하거나 가공할 수 있도록 합니다. ..
[JPA] Bulk Insert를 사용해서 쿼리 성능 개선하기
·
Teck Stack/Java
개요콘서트 서비스를 개발하다가 마주친 쿼리 성능 개선 과정에 대해 다루어보고자 합니다. JPA를 사용하여 DB에 데이터를 저장하기 위해서는 save() 또는 saveAll()을 호출해서 데이터를 저장합니다. save()를 사용하여 10000개의 데이터를 저장하는 경우 10000개의 insert 쿼리가 발생했고 이를 개선하여 한 번의 insert쿼리로 저장하고자 했습니다. save() vs saveAll()save()를 사용하는 경우 각 호출 단위에 대해 트랜잭션이 동작하고, saveAll()을 사용하는 경우에는 저장되는 데이터 묶음이 하나의 트랜잭션 단위에서 동작합니다. 한 번의 트랜잭션에서 저장이 수행되기 때문에 saveAll()을 사용하는 경우 성능이 개선됩니다. 하지만 이 두 가지 방..