220619 스터디 준비

백규현·2022년 6월 18일
0

[NETWORK]

주소창에 www.naver.com을 입력하면 일어나는 일

  1. www.naver.com는 도메인 네임으로 되어있기 때문에 DNS에 도메인을 검색하기 위한 요청을 보낸다.

  2. DNS는 일련의 과정을 거친 후 (www.naver.com)에 대응하는 ip주소를 응답으로 돌려준다.

  3. 받은 ip주소를 사용하여 TCP통신을 통해 해당 ip서버에 요청을 보낸다.

  4. 요청을 받은 서버(www.naver.com)는 요청 내용에 대한 일련에 처리 과정을 거처 응답 메시지를 만든다.

  5. 응답메시지를 TCP통신을 통해 다시 클라이언트에게 전송한다.

  1. 브라우저는 받은 응답메시지를 HTTP 프로토콜을 사용하여 웹페이지를 구성하며 사용자에게 Naver 화면을 보여준다.

참고링크


127.0.0.1과 localhost가 무엇을 의미하는걸까요?

OS 자체적으로 제공하고, 항상 고정되어 있는 IP(127.0.0.1) 과 호스트네임(localhost) 을 갖는다.
127.0.0.1은 예약된 IP주소로 인터넷상에 일반 IP로는 쓰일 수 없는 주소이다.
OS에서 가상으로 지원하며, 랜카드 등 디바이스 자체를 통과하지 않고 소프트웨어적으로 처리된다.

반면 자신이 인터넷 상에 할당된 IP의 경우
자신의 IP로 직접 접근할 때는 랜카드 드라이버 등 디바이스 영역을 통과하여 처리되기 때문에 localhost로 접근하는게 더 빠르고 시스템자원을 덜 쓰게 된다.


프록시 서버가 필요한 이유가 무엇일까요?

클라이언트가 자신을 거쳐 다른 네트워크에 접속할 수 있도록 중간에서 대리해주는 서버를 말한다. 서버와 클라이언트 사이에서 대리로 통신을 수행해주는 것을 프록시 라고 하고 그 기능을 하는 서버를 프록시 서버라 부르게 되는 것이다.

동작과정

  1. 클라이언트에서 프록시 서버로 데이터 전송
  2. 프록시 서버에서 다시 웹 서버로 웹 요청
  3. 웹 서버에서 프록시 서버로 웹 응답
  4. 프록시 서버에서 클라이언트로 데이터 전송

사용하는 이유

  • 캐시 데이터를 사용하기 위해

프록시 서버 중 일부는 프록시 서버에 요청된 내용을 캐시를 사용해 저장해둔다. 그렇게되면 캐시에 저장되어있는 내용에 대한 재요청은 서버에 따로 접속할 필요가 없이 저장된 내용을 그대로 돌려주면 되기 때문에 전송 시간을 절약할 수 있다.

  • 보안 목적

프록시 서버가 중간에 경유하게 되면 IP를 숨기는 것이 가능하다. 또한 프록시 서버를 방화벅으로 사용하기도 한다.


[JAVA]

Generic, 제네릭에 대해서 알아볼까요?

제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다.

사용하는 이유

  • 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지한다.
  • 타입 변환을 할 필요 없다.
  • 재사용성이 좋아진다.
public class ClassName<T, K> {...}

public class Main{
	public static void main(String[] args){
		ClassName<String, Integer> a = new ClassName<String, Integer>();
	}
}

인터페이스와 추상 클래스는 어떤 차이가 있을까요?

추상클래스

  • 추상 메서드를 선언하여 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스이다.
  • 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다.
  • class 앞에 abstract 예약어를 사용하여 상속을 통해서 구현해야만 한다는 것을 알려준다.

인터페이스

  • 인터페이스 또한 추상 클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성한다.
  • 클래스와 다르게 다중상속이 가능하다.

차이점

추상클래스는 IS - A "~이다".
인터페이스는 HAS - A "~을 할 수 있는".

한개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현한다.


final 키워드에 대해 알아봅시다!

변수
값을 선언하고 초기화 한 뒤에는 변경할 수 없다.
객체의 경우 객체 내부의 값은 final의 영향을 받지 않아 수정할 수 있다.

메서드
오버라이딩을 막을 수 있습니다.

클래스
상속을 막을 수 있다.
자바에서 제공하는 클래스 들 중 Wrapper 클래스 같이 재정의를 해서는 안되는 클래스의 경우 final 선언이 되어있다.


try-with-resource에 대해 들어보셨나요?

JAVA 7 버전 이후에 추가된 try-with-resource 기능은
try 구문에 리소스를 선언하고, 리소스를 다 사용하고 나면 자동으로 반납 해주는 기능이다.

사용 예시

try (SomeResource resource = getResource()) {
    use(resource);
} catch(...) {
    ...
}

이때 try에 전달할 수 있는 자원은 AutoCloseable 인터페이스의 구현체로 한정된다.
리소스를 try안의 괄호에 전달할 때, ;로 구분하여 다수의 리소스를 사용할 수 있다.


[Spring]

Spring Bean은 무엇일까요?

Bean은 Spring IoC Container가 관리하는 자바 객체, Spring Bean Container에 존재하는 객체를 말한다.

Spring IoC(Inversion of Control) Contatiner에 의해 인스턴스화, 관리, 생성된다.

Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.

Spring에서 Bean은 보통 Singleton으로 존재한다.

Beans는 Application의 핵심을 이루는 객체이며, 대부분 Container에 공급하는 설정 메타 데이터(XML 파일)에 의해 생성된다.

Container는 이 메타 데이터를 통해 Bean의 생성, Bean Life Cycle, Bean Dependency(종속성) 등을 알 수 있다.

new 연산자로 생성하는 객체는 Bean이 아니고, ApplicationContext.getBean()으로 얻어질 수 있는 객체는 Bean이다.

즉, Spring에서의 Bean은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.


Spring Bean의 scope에 대해 알아봅시다.

Singleton

  • ‘singleton’ bean은 Spring 컨테이너에서 한 번 생성된다. 컨테이너가 사라질 때 bean도 제거된다.
  • 생성된 하나의 인스턴스는 single beans cache에 저장되고, 해당 bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환한다. 즉, 하나만 생성되기 때문에 동일한 것을 참조한다.
  • 기본적으로 모든 bean은 scope이 명시적으로 지정되지 않으면 singleton이다.

Prototype

  • ‘prototype’ bean은 모든 요청에서 새로운 객체를 생성하는 것을 의미한다.
  • 의존성 관계의 bean에 주입 될 때 새로운 객체가 생성되어 주입된다. 정상적인 방식으로 gc에 의해 bean이 제거된다.

POJO란 무엇인가요? Spring 프레임워크에서 POJO는 무엇에 해당할까요?

POJO의 조건
1. 특정 규약에 종속되지 않는다.

  • 단일 상속 제한 때문에 객체지향적인 설계기법 적용하기 어려워짐
  • 다른 환경으로의 이전이 어려움
  1. 특정 환경에 종속되지 않는다.
    예를 들어 웹환경에 종속되는 HttpServletRequest나 HttpSession와 관련된 API를 직접 이용해서는 안된다.
  • 다른 환경에서 사용하기 어려움
  • 비즈니스 로직과 기술적인 내용을 담은 웹정보 코드가 섞여 이해하기 어려워짐
  • 웹서버에 올리지 않고 독립적으로 테스트하기 어려워짐
  1. 단일 책임 원칙을 지키는 클래스
    단순히 1,2번을 지켰다고 POJO라 할 수 없다. 책임과 역할이 각기 다른 코드를 하나의 클래스에 넣는 경우 진정한 POJO라 할 수 없다.

즉, POJO란 객체지향적인 원리에 충실하면서, 특정 환경과 규약에 종속되지 않아 필요에 따라 재사용될 수 있는 방식으로 설계된 오브젝트라 할 수 있다.

POJO의 장점

  • 특정 규약에 종속되지 않아 객체지향 설계를 할 수 있게 됨.
  • 특정 환경에 종속되지 않아 테스트 하기 좋음
  • 특정 규약에 종속되지 않아 로우레벨 코드와 비즈니스 코드가 분리되어 깔끔한 코드 작성이 가능
profile
반갑습니다.

0개의 댓글