본문 바로가기

Dev.BackEnd

(66)
[SpringBoot] WebSocket을 활용한 채팅 구현하기. [SpringBoot] WebSocket을 활용한 채팅 구현하기 Spring WebSocket이란? Spring 4.0 부터 지원하고 있으며 공식문서에는 Real-time full duplex communication over TCP 이라고 설명이 되어 있다. WebSocket 프로토콜 RFC 6455는 클라이언트와 서버간의 전이중, 양방향 통신과 같은 웹 응용 프로그램을 위한 중요한 기능을 정의한다. XMLHttpRequest, 서버 전송 이벤트 등을 포함하여 웹을 보다 interactive하게 만드는 기술이다. WebSocket은 메시징(Messagine) 아키텍쳐를 의미하지만 특정 메시징 프로토콜의 사용을 요구하지는 않는다. TCP를 통한 매우 얇은 레이어로, 바이트 스트림을 메시지의 스트림으로 변..
[Java8] 3. Optional Class 3. Optional ClassNPE(NullPointerException) 때문에 고생한 경험이 한 두 번이 아닐거라 생각한다. 그래서 Java8 에서는 하스켈, 스칼라 등의 함수형 언어에서 사용되고 있는 ‘선택형 값’ 개념의 영향을 받아 Optional 라는 새로운 클래스를 제공한다. 값이 없는 상황을 모델링하는 것이다. Optional은 선택형 값을 캡슐화하는 클래스이다. 값이 존재하면 그 값을 감싼다. 값이 없는 경우에는 Optional.empty 메서드로 Optional을 반환한다. empty 메서드는 Optional의 특별한 싱글턴 인스턴스를 반환하는 정적 팩토리 메서드이다. null 레퍼런스와 Optional.empty()는 의미상으로 비슷하지만 실제로 차이점이 많다. null을 참조하려 하..
[Java8] 2. Default Method(디폴트 메서드) 2. 디폴트 메서드Java 8에서는 디폴트 메서드라는 것을 사용하여 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 인터페이스에서 이미 구현을 했으니 해당 인터페이스를 구현하는 클래스에서는 추가된 메서드의 구현을 추가적으로 할 필요가 없다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 디폴트 메서드를 활용하면 자바 API의 호환성을 유지하면서 라이브러리를 변경할 수 있다. 기존에는 이미 공개된 라이브러리를 수정할 때 인터페이스에 메서드를 추가하게 되면 해당 인터페이스를 구현하고 있는 클래스에 모두 메서드를 구현해줘야 했지만 디폴트 메서드를 통해 구현하면 그렇게 하지 않아도 된다. 훨씬 더 유연해진 것이다. 이와 같은 방식..
[JAVA8] 1. 동작 파라미터화 전달하기 [JAVA 8] 1. 동작을 파라미터로 전달하기 메소드 내부에서 실행되는 동작이 유동적인 경우가 있다. 이러한 경우 오버로딩을 사용하여 해결할 수 있지만, 전달되는 파라미터가 동일한 경우 그럴 수 없다. 때문에 메소드 내부에서 if 문을 통해 해당하는 동작에 따라 실행되도록 해야 한다. 이것에는 실제 수행되어야 하는 비즈니스 로직과 상관없는 코드들을 생성하고, 실행해야 한다는 문제점이 있다. 더욱이 가독성은 지극히 떨어지며 그 메소드는 더이상 한 가지 일만 수행하지 않게 된다. 코드를 살펴보자. private List filter(List list) { List result = new ArrayList(); for (Apple apple : list) { if (apple.getColor().equals..
[DP] 2. 빌더 패턴(Builder Pattern) #2. 빌더 패턴(Builder pattern)인스턴스를 생성할 때, 생성자(Constructor)만을 통해서 생성하는데는 어려움이 있다. 빌더 패턴은 이 문제를 기반으로 고안된 패턴 중 하나이다. 예를 들면, 생성자 인자로 너무 많은 인자가 넘겨지는 경우 어떠한 인자가 어떠한 값을 나타내는지 확인하기 힘들다. 또 어떠한 인스턴스의 경우에는 특정 인자만으로 생성해야 하는 경우가 발생한다. 이럴 경우, 특정 인자에 해당하는 값을 null로 전달해줘야 하는데, 이는 코드의 가독성 측면에서 매우 좋지 않다는 것을 직감적으로 알 수 있다.코드를 통해 확인해보자.public Student(long id, String name, String major, int age, String address) { this.id..
[JAVA Adv] Blocking I/O, ServerSocket, Socket 그리고 Thread Pool Blocking I/O, ServerSocket, Socket 그리고 Thread Pool성능에 영향을 미치는 결정적인 요인으로서의 I/O에는 크게 두 가지 I/O가 존재한다. 디스크에서 데이터를 읽어오는 I/O와 네트워크 통신에서 발생하는 I/O이다. 이 두 I/O 작업이 처리되는 속도는 CPU의 작업 처리 속도에 비해 매우 느리다. 그렇기 때문에 애플리케이션의 성능은 이 I/O 작업을 어떻게 처리하느냐에 달려있다고 할 수 있다. 그 중 네트워크 통신에 사용하는 Socket을 중심으로 I/O 방식을 알아보자. Socket소켓(Socket)의 정의를 다시 한 번 짚고 가자면, 소켓이란 데이터 송수신을 위한 네트워크 추상화 단위로 IP주소와 포트를 가지고 있으며 양방향 네트워크 통신이 가능한 객체다. 이 ..
[JAVA Adv] StringBuffer vs StringBuilder 그리고 String StringBuffer vs StringBuilder String 의 정체두 클래스의 차이를 알기 위해서 일단 String 객체의 정체를 짚어보고 가자. String 객체는 기본적으로 immutable 이다. 내부적으로 char[] 배열을 사용하고 있고 이 배열은 변경이 불가능하다는 뜻이다. 즉, Constant Pool에 문자열이 특정 상수로 저장되어 더 이상 변하지 않는, 변할 수 없는 값이 되는 것이다. (물론 참조 변수인 String 객체는 Heap 영역에 생성된다! String 객체 자체가 Constant Pool에 생성된다는 것이 아니다.) 이 String 객체에 문자열을 저장하고, + 연산자 또는 concat 메소드를 통해 새로운 문자열을 덧붙이려고 할 때는, 기존의 String 객체가 가리..
[DP] 1. 싱글턴 패턴(Singleton pattern) #1. 싱글턴 패턴(Singleton Pattern) 싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러 개 만들게 되면 자원을 낭비하게 되거나 버그를 발생시킬 수 있으므로 오직 하나만 생성하고 그 인스턴스를 사용하도록 하는 것이 이 패턴의 목적이다. 하나의 인스턴스만을 유지하기 위해 인스턴스 생성에 특별한 제약을 걸어둬야 한다. new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정하고, 유일한 단일 객체를 반환할 수 있도록 정적 메소드를 지원해야 한다. 또한 유일한 단일 객체를 참조할 정적 참조변수가 필요하다. Singleton.java >> ver.1 public class Singleton { p..