본문 바로가기

전체 글

[MySQL] 내가 원하는 순서대로 Order by 조건을 주자 최근 회사에서 FE에서 특정 필드의 순서를 담아 API 요청을 하고, 그 순서대로 json 형태로 return을 해야하는 케이스가 발생했다. 결국 깔끔하게 가져오려면 API에서 조건 반복을 돌리기보다는 DB의 쿼리로 조건을 뽑아내고 싶었다. 하지만 일반적인 경우 order by 조건은 특정 컬럼을 기준으로 오름(내림)차순만 가능했다. 하지만 아래와 같이 'FIELD' 값으로 컬럼을 지정하고 순서를 입력하게 된다면. 내가 원하는 순서대로 조회가 가능했다. SELECT VALUE FROM TABLE ORDER BY FIELD(VALUE, 'val3', 'val1', 'val2'); 하지만, 문제는 DB단에서 처리한다고는 했지만, 실제로는 QueryDSL을 사용하여 조회 쿼리를 수행하고 있었다는 것이다. 이에.. 더보기
[Java] JVM - ClassLoader(아주 얕은 수준) 최근 APM(Application Performance Monitoring) 시스템을 담당하게 되면서, 기존 애플리케이션을 분석하는 과정에 있는데, 그동안 몰랐던 다양한 개념들에 대해 많이 알아가고 있는 중이다. 그리고 그 중에 JVM의 한 영역이 ClassLoader에 대해 간단한 역할 정도만 알고 있었는데, 조금 더 깊게 알아볼 기회가 생겼고, 그 부분에 대해 공부한 점을 정리하고자 한다. 이전에는 클래스로더를 단순히 ".class 파일을 읽어 바이너리 코드로 변환한다" 정도로만 알고 있었다. 클래스로더는 기본적으로 3가지로 구분된다(물론 Java 버전에 따라 조금씩 차이가 있다) Java 8을 기준으로 보면.. BootStrap ClassLoader Extension ClassLoader Appli.. 더보기
[Java]Try-with-resource 최근 자바 기본서 한 권을 마무리하면서, 당연히 기본적인 내용은 다 알 것이라고 생각했던 부분에서 전혀 몰랐던 개념들에 대해 많이 알게 되었다. 그 중 하나가 Try-with-resource이다. Try-with-resource는 Java 7 이후에 추가되었다. 일반적으로 자바에서 자원(리소스)을 사용할 때 Try { } catch { } 구문을 사용하고, 사용한 자원에 대해 close() 메서드 등을 통해 해제하는것이 일반적이다. 하지만 매번 개발자가 번거롭게 선언과 해제를 해주는 부분을 한층 더 편하게 가져가기 위해 Try-with-resource 개념이 도입되었다. 기존의 try-catch 구문은 아래와 같이 사용하였다. 주로 finally 구문을 선언해 리소스를 해제했다 문제는 개발자도 사람인지라.. 더보기
[Java] 자바의 메모리 영역(2) 최근 안드로이드 개발을 담당하면서, 스프링에 의존하여 웹개발을 하던 시기보다, JAVA의 근본적인 원리에 대해 더 깊은 이해가 필요하게 되었다. 새삼 스프링 프레임워크의 강력함에 대해 느끼게 됨과 동시에.. 기초가 많이 부족하다는 것 또한 깨닫게 되었다. 이전에 간략하게 메모리 영역에 대해 포스팅 하였으나, 이 기회에 조금 더 상세하게 이해하고 작성해보고자 한다. 1. 메모리 프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간 메모리 구조에 대해 공부해야 하는 이유 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다. 메모리 관리가 되지 않는 경우 속도저하나 튕김이 발생할 수 있다. 한정된 메모리를 효율적으로 사용함으로서 높은 성능을 내고자 함. 2. JVM JVM은 Java Virt.. 더보기
[DB]격리수준(Isolation Level) 실제 운영중인 시스템에서, 데이터베이스에 의도하지 않은 값이 들어가거나, 중간에 엉뚱한 Insert 또는 Update 쿼리로 인해 데드락이 발생하는 경우가 있었다.(심지어 Select 임에도 불구하고...) 왜 Select중에 교착상태가 발생하는 것일까...? 의문을 가지게 되면서 데이터베이스의 격리수준에 대해 공부하게 되었다. 데이터베이스의 격리 수준은 대표적으로 4가지로 나뉘어진다.(아래로 갈수록 격리 수준 ↑, 성능 ↓) 1. READ UNCOMMITTED 2. READ COMMITTED 3. REPEATABLE READ 4. SERIALIZABLE 하나씩 살펴보자면 1. READ UNCOMMITTED Commit 되지 않은 데이터를 읽을 수 있다. 즉 하나의 트랜잭션에서 Insert나 Update.. 더보기
[Java]Serialization(직렬화) 스프링에 대해 공부하면서.. Serializable 인터페이스를 구현받는 부분이 있었다. 단순히 직렬화 라고만 알고 있었지, 정확히 어떤 목적으로 사용하는지 확실히 몰랐었기 때문에 이번에 정리해본다. 직렬화가 필요한 상황이라 한다면... 생성한 객체를 파일로 저장하는 경우 저장한 객체를 읽는 경우 다른 서버에서 생성한 객체를 받는 경우 이런 상황에서 필요한 것이 직렬화(Serializable)이다. Serializable 인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다. 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로.. 더보기
[Spring] Security 정리(1) 지금 실무에서 사용하고 있는 스프링 보안은 인터셉터를 활용하여 구현되어 있으나, 필터를 기반으로 동작하는 스프링 시큐리티에 대해서 확실히 알 필요가 있다고 생각하여(사용은 해보았지만..원리는 잘 모르고 썼었다), 정리해보려고 한다. 1. 스프링 시큐리티의 정의 스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크이다. 시큐리티를 사용하지 않고 직접 인증, 인가를 구현한다면, 자체적으로 세션을 체크하고, 페이지를 redirect 해주는 등 직접 손보아야 할 일이 많아질 것이다. 2. 보안 관련 용어 정의 접근 주체(Principal) : 보호된 대상에 접근하는 유저 인증(Authenticate) : 현재 접근하는 유저가 누구인지 확인, 애플리케이션의 작업을 수행할 수 있는 주체임을 증명 인가(Author.. 더보기
[JPA] JPA의 어노테이션(1) JPA는 자바의 대표적인 ORM(Object Relational Mapping) 프레임워크이다. 즉 객체지향언어의 객체를 RDBMS(관계형데이터베이스)와 자동으로 매핑해주는 개념이고, JPA는 이러한 ORM의 대표적인 기술 표준이다. 이전 글에서도 간단히 몇 가지를 언급하였지만, JPA에서 주로 사용되는 어노테이션이 어떤 것들이 있는지 기록해본다. @Entity : 테이블과 1:1로 매칭이 되는 객체의 단위이며 엔티티에는 적어도 하나의 Id가 필요하다 @Id : DB 테이블은 기본적으로 유일한 값(Primary Key)을 가진다. JPA에서는 이러한 PK를 @Id를 통해 지정해준다. @Table(name = "XXXX") : 엔티티의 클래스명 그대로 테이블명을 사용한다면 상관없지만, 따로 매핑되는 테이블.. 더보기