전체 글 361

Java - 제네릭(Generic)은 무엇인가? 에 대한 정리! (1)

제너릭(Generic) 제너릭(Generic)은 JDK ArrayList나 LinkedList, HashMap 등의 자료구조를 사용할 때 주로 사용한다. ArrayList students = new ArrayList(); 그렇다면 제너릭의 정확한 역할은 무엇인가 ? 우리는 제너릭을 잘 활용하고 있을까? 제너릭을 사용하는 이유 제너릭은 JDK 1.5에 처음 도입되었다. Oracle Javadoc - Generics add stability to your code by making more of your bugs detectable at compile time. 다음은 제너릭의 기능을 정리한 것이다. 잘못된 타입이 들어오는 것을 컴파일 단계에서 방지한다. 자바 컴파일러는 잘못 사용된 타입 때문에 발생하는 에..

Language/Java 2022.05.08

Querydsl - 동적 쿼리(Dynamic SQL) 사용하기 !

동적 쿼리란 ? 동적 쿼리란 상황에 따라 다른 문법의 SQL을 적용하는 것을 말한다. 예를 들면 DB에서 값을 조회할 때 조회 조건이 동적으로 바뀌어야 하는 경우가 많다. 이런 상황을 Querydsl을 사용하면 손쉽게 해결할 수 있다. name 값이 들어오면 WHERE name = ${name} age 값이 들어오면 WHERE age = ${age} name과 age가 모두 들어오면 WHERE name = ${name} AND age=${age} name과 age 모두 들어오지 않으면 WHERE 절을 사용하지 않는다. 이를 해결하기 위한 방법을 살펴보자. 1. BooleanBuilder 동적 쿼리를 해결하려고 BooleanBuilder를 사용하는 걸 자주 볼 수 있다. private List search..

Server/Spring JPA 2022.05.07

Java - ArrayList가 가변적일 수 있는 이유 (+ Size 지정하는 이유)

ArrayList 자바에서 배열은 크기가 고정된 데이터 구조이다. 반면에, ArrayList는 가변적인 크기를 가지고 있다. 일반적인 배열은 우리가 알고 있는 형태로 Heap에 저장된다. ArrayList는 물리적으로 원소들이 연속되어야 한다. 만약 여기서 Heap에 새로운 Object가 들어왔다고 가정하자. 그러면 List에 새로운 원소를 생성할 수 없게 된다. "ArrayList는 어떻게 가변적인 길이를 가질 수 있을까?"에 대해 알아보자. add() ArrayList 클래스의 add() 메서드를 살펴보자. add()를 사용하면 내부적으로 오버로딩된 add 메서드를 호출한다. 메서드 내부를 살펴보면 흥미로운 사실을 알 수 있다. ArrayList는 내부적으로 elementData라는 배열을 가지고 있..

Language/Java 2022.05.07

Database의 책임 - DB는 어디까지 해줘야 하는가? (+ 데이터 가공, 비즈니스 로직, 계산 등)

Database의 책임 이전부터 비즈니스 로직이 어디에 있어야 하는지는 큰 관심사였다고 한다. 나는 Controller, Service, Repository, Dto 등의 책임에 대해서 자료를 많이 봤지만 "DB는 어떤 작업까지 처리하는 것이 바람직한가?" 그러한 생각을 해본적이 없었다. 우리 회사의 서비스들을 보면 DB에서 SELECT절에서 CONCAT()이나 IF()를 통해 가공해서 내려주는 경우가 많다. 그래서 그것을 프론트단에서 아주 손쉽게 사용할 수 있다. 추가적으로 복잡한 비즈니스 로직을 DB Layer에서 태우는 경우도 있다. 뭔가 Application Layer에서 로직을 태우면 선형으로 순회하면서 레코드 하나씩 가공을 해줘야 한다는 부담감 때문이었다. 데이터베이스(Database)의 책임..

Database/Server 2022.05.06

Sequelize - FROM 절에 SubQuery 사용하기 !

SubQuery in FROM clause Sequelize ORM을 사용중인 프로젝트에 FROM 절에 SubQuery를 사용해야 하는 이슈가 생겼다. "Sequelize subquery in from clause" 등의 키워드로 검색해봤는데, 결과가 나오지 않았다 ㅠ 관련해서 어떻게든 삽질해서 검색을 해봤는데 JPA, JPQL, Sequelize 등 대부분의 ORM에서 from 절에서 서브쿼리를 사용하는 것(이하 "인라인뷰")를 지원하지 않는다고 한다. 대처방안으로는 아래와 같은 방법이 있다. 서브쿼리보다는 Join을 사용한다. 쿼리를 2개 이상으로 분리한 후 가공 작업을 한다. 또는 작업을 분할하고 특정 기능은 App Layer나 Presentation Layer에서 수행한다. RawQuery(이하 ..

Server/Node.js 2022.05.05

Javascript - Ajax 여러개 결과 기다렸다가 특정 함수를 실행하는 방법 비교!

Ajax 결과 대기 기존에는 Ajax로 요청 하나만 보내는 것을 MSA를 도입하면서 4가지 API에 요청해서 결과를 조합하도록 수정해야 하는 상황이 발생했다. 관련하여 요즘 많이 사용하는 메소드가 Promise.all()이다. 사내에서 운영중인 서비스는 IE도 고려해야해서 ES6 문법을 사용할 수 없었다. 혹시나 싶어서 호환성을 살펴봤는데, 역시나 IE 지원이 안된다. async: false Ajax 요청은 기본적으로 비동기로 동작한다. Ajax 속성 중에 async를 false로 설정하면 동기 방식으로 동작한다. $.ajax({ type: 'get', url: API_URL+'/users?query='+search, contentType: 'application/json; charset=utf-8', ..

Spring - 샤딩 모듈 개발 이야기 (feat. AbstractRoutingDataSource)

동적 데이터 소스와 스키마 이름API를 개발할 때 Java Spring으로 프로젝트를 진행하고 싶었는데 어려움이 있었다.해당 문제를 해결하고 세미나에서 발표한 내용에 대해 정리한다.모든 아키텍처나 코드는 실제 서비스와 무관하며 설명을 위해 만든 부분임을 알린다.API를 Java Spring으로 할 수 없었던 이유는 서비스의 DB구조 때문이었다.구조를 보면 DB 서버를 여러 대로 샤딩(Sharding) 하고 있고, 스키마도 분산되어 있다.데이터를 저장할 때 유저가 속한 지역별로 데이터를 특정 DB서버의 특정 스키마에 저장해서 사용한다.board_01에서 01을 파티션이라고 칭한다.특정 유저의 정보가 어떤 DB 서버의 몇 번째 파티션(스키마) 에 저장되어 있는지는 Region DB에 저장되어 있고, DB를 ..

Server/Spring JPA 2022.05.05

Java - PreparedStatement란 무엇인가?

Statement 자바에서 쿼리문을 사용할 때 java.sql 패키지에 있는 Statement를 사용한다. Statement는 SQL문을 실행할 때 사용하는 인터페이스이다. Statement는 다음과 같은 동작 방식을 가진다. PreparedStatement PreparedStatement는 Statement를 상속하고 있는 Interface이다. PreparedStatement는 내부적으로 Statement의 4단계 과정 중 첫 번째 parse 과정의 결과를 캐싱하고, 나머지 3가지 단계만 거쳐서 SQL문이 실행될 수 있게 한다. PreparedState를 사용하면 구문 분석(parse)의 결과를 캐싱해서 과정을 생략할 수 있으므로 성능이 향상된다. 많은 분들이 아시고 계시길 PreparedStatem..

Language/Java 2022.05.03

트랜잭션은 언제 시작되고 언제 종료되는가? (트랜잭션 시작 시점과 종료 시점)

트랜잭션(Transaction) 종료 시점 "트랜잭션은 언제 종료되는가"에 대해 알아보자. 먼저 트랜잭션의 종료 시점을 알아보기에 앞서 시작 시점을 먼저 알아보자! 트랜잭션이 자동으로 시작되는 시점은 아래와 같다. DML(INSERT, UPDATE, DELETE) 문장이 실행되는 경우 DDL(CREATE, ALTER, DROP) 문장이 실행되는 경우 DCL(GRANT, REVOKE) 문장이 실행되는 경우 트랜잭션은 아래와 같은 상황에 자동으로 종료 된다. COMMIT, ROLLBACK 문을 실행한 경우 DDL 또는 DCL 문 실행 기계 장애 또는 시스템 충돌(crash) deadlock 발생 강제 종료 DDL(Create, Alter, Drop, Truncate) 또는 DCL(Grant, Revoke)문..

Database/SQL 2022.05.02

Java - Perm 영역이 Metaspace로 바뀐 이유! [+ Heap Area, Native Memory 차이]

JDK 8부터는 Java Heap에서 PermGen이라는 영역이 제거되었고, Metaspace라는 영역이 Native Memory에 추가되었다. 기존에 Perm 영역 크기로 인한 java.lang.OutOfMemory가 뜨는 경우가 많았다. PermGen이라는 영역이 제거되고 Metaspace 영역이 생기면서 이제는 해당 문제를 보기 어려워졌다. 그 이유를 알아보자. Perm PermGen(이하 Perm) 영역은 상수와 static 변수, 런타임 중에 읽은 클래스와 메소드의 메타데이터를 저장한다. PermGen 영역의 크기는 JVM이 사이즈를 지정한다. 앱이 실행되면 최대 사이즈는 변경되지 않는다. 동적으로 클래스들이 로드되고 Static 변수나 상수가 Perm영역에 쌓이게 되면서 OOM이 자주 발생했다..

Language/Java 2022.04.29