전체 글 (70) 썸네일형 리스트형 동기 vs 비동기, 블로킹 vs 논블로킹 동기와 비동기를 판단하는 기준은 작업 완료이다. 동기는 호출한 함수가 작업 완료를 스스로 신경 쓴다. 비동기는 호출된 함수(callback 함수)가 신경 쓰고, 호출한 함수는 신경 쓰지 않는다. 동기 (Synchronous) 요청과 결과가 동시에 일어난다. 어떤 작업에 대한 요청이 발생했을 때, 그 요청에 대한 응답을 받을 때까지 대기해야 한다. 작업에 대한 완료를 호출한 함수가 신경 쓴다. Thread1, Thread2가 존재할 때, Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 대기 상태가 된다. 비동기 (Asynchronous) 요청과 결과가 동시에 일어나지 않는다. 작업에 대한 완료를 호출 함수가 아닌 callbac.. 가비지 컬렉션 프로그램을 개발하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생한다. C언어를 사용하면 직접 메모리를 해제해주어야 한다. 하지만, Java나 Kotlin을 이용하면 개발자가 메모리를 직접 해제하는 일은 거의 없다. 그 이유는 JVM의 가비지 컬렉터(Garbage Collector)가 불필요한 메모리를 알아서 정리해 주기 때문이다. Java에서 명시적으로 불필요한 데이터를 표현하기 위해서는 null을 선언해 주면 된다. Person person = new Person(); person.setName("꽁탁"); person = null; // 가비지 발생 person = new Person(); person.setName("꽁탁2"); 위의 코드에서 기존의 "꽁탁"으로 생성된 person 객.. 커넥션 풀 커넥션(Connection)은 데이터베이스 서버에 연결하기 위해 사용되는 객체로, 커넥션이 생성될 때마다 시스템의 자원(CPU, 메모리 등)의 많은 소모와 시간이 발생한다. 따라서, 웹 애플리케이션에서 클라이언트의 요청마다 데이터베이스와 연결하기 위해 커넥션을 생성하게 되면 많은 오버헤드가 발생하게 된다. 커넥션 풀(Connection Pool)은 웹 컨테이너(WAS)가 실행되면서 데이터베이스와 연결하는 커넥션을 미리 생성하여 풀(Pool)에 저장해 두었다가, 클라이언트의 요청이 오면 풀에서 커넥션을 꺼내 사용하고, 처리가 끝나면 다시 반납하여 풀에 저장하는 방식이다. 커넥션 풀을 사용하면 다음과 같은 순서로 동작한다. 1. 커넥션 요청 발생 2. 커넥션 풀에 존재하는 커넥션을 제공 3. 커넥션 사용 및.. 로깅 시 System.out.println()을 사용하지 않는 이유 System.out.println() 메서드는 자바 표준 출력이다. 하지만, 현업에서는 단순 디버깅 용도로도 System.out.println()을 사용하지 않는다고 한다. 휘발된다 System.out.println()은 표준 출력으로 사용한다. 즉, 파일로 저장되지 않고 휘발된다. 로그 파일로서 관리가 불가하여 문제를 기록하고 처리할 때, 로그를 확인할 수 없다. 에러 발생 시 추적할 수 있는 최소한의 정보가 남지 않는다 System.out.println()은 단순히 문자열을 출력하는 메서드이다. 따라서, 로깅 시 필요한 문제가 발생한 날짜, 시각, 문제의 수준, 위치 등 최소한의 정보가 기록되지 않는다. 이런 정보도 함께 인자로 전달하여 추적할 순 있지만, 매번 그런 정보를 일일이 남기는 작업은 번거.. new String()과 리터럴("") "꽁탁" != new String("꽁탁"); new String() new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리에 새로운 주소를 할당받는다. 따라서, 모든 String 변수의 주소가 다르게 저장된다. String a = "ABC"; //in String Constant Pool String b = new String("ABC"); //in Heap String c = new String("ABC"); //in Heap System.out.println(a == b || a == c); // false String 리터럴 문자열 리터럴은 Heap 내의 String Constant Pool이라는 영역에 할당된다. 만약, 이미 같은 값을 가지고 있는 리터럴이 Con.. String, StringBuffer, StringBuilder 자바에서 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder가 있다. String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가진다. String 자바에서 String 객체의 값은 변경할 수 없다. public final class String implements java.io.Serializable, Comparable { private final byte[] value; } String의 내부 구성 요소는 위와 같은데, 상수(final)형으로 선언되어 있어 변경할 수 없다. String str = "hello"; str = str + " world"; System.out.println(str); // hell.. equals()와 hashCode() 자바의 모든 클래스는 Object 클래스를 상속받는다. Object 클래스에는 equals()와 hashCode()라는 메서드가 선언되어 있어, 모든 클래스는 equals()와 hashCode()를 상속받는다. equals() equals() 메서드는 어떤 두 객체가 동일한지 비교할 때 사용한다. 이는 동일성(Identity)을 비교하는 것이다. 즉, 두 객체가 동일한 메모리 주소일 경우에만 동일한 객체가 된다. 하지만, 프로그래밍 상에서 같은 값을 가지는 객체를 같은 객체로 인식해야 하는데, 이러한 동등성(Equality)을 위해 equals() 메서드를 오버라이딩 해야 한다. String name1 = new String("꽁탁"); String name2 = new String("꽁탁"); Syst.. @Transactional(readOnly=true) 스프링에서 조회용 메서드에 @Transactional(readOnly=true)를 사용했다. @Transactional(readOnly=true)의 이점은 무엇일까? 조회한 데이터가 의도치 않게 변경되는 일을 방지할 수 있다. JPA의 변경감지 작업을 수행하지 않기 때문에 스냅샷을 따로 보관하지 않아도 되고, 메모리를 절약할 수 있다. 데이터베이스 구조가 Master - Slave로 구성되어 있을 경우, readOnly=true는 읽기 전용으로 Slave를 호출한다. 따라서 DB 서버의 부하를 줄일 수 있다. 코드의 가독성을 높혀준다. 코드를 접하는 사람들이 직관적으로 해당 메서드가 Read에 대한 동작만 수행할 것이라고 예상할 수 있다. 이전 1 2 3 4 ··· 9 다음