Java 8부터 사용할 수 있는 람다(lamda) 표현식은 주로 함수형 인터페이스를 구현하는데 사용된다. 예를 들면 아래와 같이 람다를 활용하면 별도의 클래스를 작성하지 않고 일회성으로 Runnable 인터페이스의 기본적인 함수인 run() 메소드를 오버라이딩하여 일회용 구현체(?) 같은 느낌으로 작성할 수 있다. 1. 람다 표현식을 활용한 인터페이스 메소드 구현 Runnable runnable = () - > System.out.println(" I'm running in a Thread "); new Thread(runnable).start(); 2. 람다 표현식을 활용한 리스트 정렬 List names = Arrays.asList("mimi", "nanan", "BBo"); names.sort(Co..
1. Request HTTP통신에서 Request는 아래와 같이 4개의 영역으로 나누어 볼 수 있다. 1. Request Line : HTTP Method, 요청 대상 URL, 사용되는 HTTP 프로토콜 버전 2. Request Header : Host(요청이 전송되는 서버의 도메인 이름), User-Agent(클라이언트에 대한 정보), Accept(클라이언트가 받을 수 있는 데이터타입), Content-Type(요청 Body의 데이터타입) Content-type은 HTTP 헤더의 일부분으로서 요청이나 응답에 포함된 데이터의 유형을 명시하는 항목이다. 이를 명확하게 명시해주어야만이 클라이언트와 서버가 올바르게 데이터를 주고받을 수 있다. 3. 공백라인 : 헤더와 Body사이에 존재하는 공백으로 헤더와 B..
VPN과 SSH가 함께 사용될 때, 일반적인 작동 방식은 다음과 같다. 1.사용자는 VPN 클라이언트를 통해 VPN 서버에 연결한다. 이 과정에서 VPN 서버와 VPN 클라이언트 사이에 암호화된 "터널"이 생성된다. 2. 생성된 안전한 VPN 터널을 통해 SSH 접속을 시도한다. 사용자의 SSH 요청은 먼저 로컬 시스템에서 암호화되고(/etc/ssh/sshd_config에 명시된 암호화방식으로), 그 후 추가적으로 VPN 터널의 암호화 과정까지 거쳐서 결국엔 이중 암호화된 데이터가 인터넷을 거치며 원격 서버까지 전달된다. 3. 원격 서버에서는 먼저 VPN 층의 암호화가 해제되고, 그 다음 SSH 층의 암호화가 해제되어 실제 요청 내용이 처리된다.따라서, SSH 접속이 VPN 터널링을 거치면 보안성이 강화..
인터넷이 안되는 환경이라면 maven에서 원격으로 신규라이브러리(artifact)들을 추가하거나 업데이트 할 수 없다. 따라서 Maven을 처음 설치했을 떄, mavend의 default local repository에 직접 추가할 라이브러리(artifact)를 jar 파일 형태로 넣어준다음 설치해주어야 한다. 1. local repository 설정 Maven이 처음 설치될 때 local repository는 windows 개발환경이라면 아래의 이미지 처럼 C:\Users\로그인사용자\ .m2\ 경로에 settings.xml파일이 존재한다. 그게 아니라면 Maven 설치 압축파일을 푼곳에 config 디렉토리에 settings.xml이 존재한다. Maven 설정파일인 setting.xml 파일을 열어보..
들어가며 Spring을 공부하면서 AOP(Aspect-Oriented Programming)은 기본적으로 듣게 되는 단어이고 개념이다. 근데 조금 어렵게 설명되어있지 않나 싶어서 내가 이해하기 편한대로 작성하고자한다. AOP란? AOP를 한줄로 설명하자면 여러 서비스 레이어나 모듈에 공통적으로 적용되는 로직을 말한다. 자세한 이해를 위해 조금 어렵게(?) 정리하면 아래와 같다. 여러 서비스나 모듈 즉, 핵심(Core)로직에공통적으로 적용되는 로직을 관점(Aspect)라는 개념(ex : 로깅처리, 트랜잭션 처리, 보안 처리)으로 분리하고 모듈화하여 필요한 시점에 적용하도록 하는 방법론으로 이는 코드의 재사용성과 가독성을 높인다. 그걸 Java에서는 Spring AOP라는 라이브러리를 통해 쉽게 개발자가 구..
1. 빌더패턴의 필요성 객체를 정의하고 생성할 때 우리는 보통 생성자라는 것을 떠올린다. UserVO userVO = new UserVO("name", 23, "etc.."); 하지만 이러한 생성자를 통한 방법은 생성자의 파라미터가 많으면 많아질수록 가독성이 떨어지고 각각 무슨값을 의미하는지 알 수가 없어 상당히 불편하다. 아래의 예시를 살펴보도록 하자. Builder 사용전 public class Person { private String firstName; private String lastName; private int age; private String phone; private String address; public Person(String firstName, String lastName, i..