Optional<> vs List<>

  • Optional은 null 또는 값을 감싸서 NPE(NullPointerException)로부터 부담을 줄이기 위해 등장한 Wrapper 클래스이다. 
  • Optional은 값을 Wrapping하고 다시 풀고, null 일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사용하면 시스템 성능이 저하된다.
  • 그렇기 때문에 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다. 즉, Optional은 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용되어야 한다.
  • Optional은 반환 타입으로써 에러가 발생할 수 있는 경우에 결과 없음을 명확히 드러내기 위해 만들어졌으며, Stream API와 결합되어 유연한 체이닝 api를 만들기 위해 탄생한 것이다. 예를 들어 Stream API의 findFirst()나 findAny()로 값을 찾는 경우에 어떤 것을 반환하는게 합리적일지 Java 언어를 설계하는 사람이 되어 고민해보자. 언어를 만드는 사람의 입장에서는 Null을 반환하는 것보다 값의 유무를 나타내는 객체를 반환하는 것이 합리적일 것이다. Java 언어 설계자들은 이러한 고민 끝에 Optional을 만든 것이다. 그러므로 Optional이 설계된 목적에 맞게 반환 타입으로만 사용되어야 한다.

 

https://mangkyu.tistory.com/203

http://www.tcpschool.com/java/java_stream_optional

 

Null vs isEmpty() 차이

Null

  • 인스턴스가 생성되지 않은 상태이다.
  • List 변수가 메모리에 아무런 주소값도 참조하지 않은 상태이다.
  • 변수에 아무것도 할당되지 않은 상태를 의미한다.

isEmpty

  • size() = 0
  • Java SE 1.6 이상부터 사용이 가능하다.
  • 배열이 생성되었으나, 배열안에 아무것도 없는 상태를 말한다.
  • 객체는 존재하지만, 공백이다.
  • 변수에 문자열값이 할당되었지만, 그 길이가 0임을 의미한다. 

 

※ Null string은 언제나 비어있지만, Empty string은 null이 아닐 수도 있다.

 

http vs https

  • HTTPS(https://)는 SSL(Secure Socket Layer) 인증서를 사용하는 HTTP(http://)입니다. SSL(또는 TLS) 인증서는 일반 HTTP 요청 및 응답을 암호화합니다. 따라서 HTTPS는 HTTP보다 더 안전한 보안용 프로토콜이라고 할 수 있습니다.
  • HTTP와 HTTPS의 유일한 차이점은 HTTPS를 사용한 웹 페이지를 통해 전송되는 모든 데이터는 추가적인 보안 계층이 있습니다. 이를 TLS(전송 계층 보안) 프로토콜이라고 합니다. 모든 유형의 데이터는 변경되거나 손상될 수 없는 HTTPS 사이트를 통해 전달되며 제3자로부터 보호됩니다.

 

※ HTTPS 확인 방법 : 도메인 이름 앞에 자물쇠 아이콘이 있으면 당신의 사이트는 HTTPS로 인해 안전한 것입니다.

 

지연로딩 vs 즉시로딩 (FetchType.LAZY or EAGER)

  • JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다.
  • 이 두 가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 불러오는 것이라고 할 수 있다.

  • 비지니스 로직 상 Member 데이터가 필요한 곳에 대부분 Team의 데이터 역시 같이 사용 할 필요가 있다면 어떨까? FetchType을 EAGER로 설정하여 항상 Member와 Team을 같이 조회해오는 것이 더 좋을 것이다.
  • Member를 사용하는 곳 대부분에서 Team 데이터가 필요하지 않다면? FetchType을 LAZY로 설정하여 Member만 조회하고, 드물게 Team이 필요할 땐 그 때 Team에 대한 쿼리를 한번 더 날려 조회하는것이 좋을 것이다.

※ 실무에서는 EAGER LOADING을 사용하지 않는 것을 권장한다. 

 

이유는?

즉시 로딩에서는 Member와 연관된 Team이 1개여서 Team을 조회하는 쿼리가 1개 나갔지만, 만약 Member를 조회하는 JPQL을 날렸는데 연관된 Team이 1000개라면? Member를 조회하는 쿼리를 하나 날렸을 뿐인데 Team을 조회하는 SQL 쿼리 1000개가 추가로 나가게 된다. 그렇기 때문에 가급적이면 기본적으로 지연 로딩을 사용하는 것이 좋다.

 

https://developer-hm.tistory.com/37

https://ahndding.tistory.com/24

 

UTF파일 인코딩

UTF-8

  • UTF는 Unicode Transformation Format의 줄임말로 전세계 모든 문자를 컴퓨터에서 표현하고 다룰 수 있도록 설계된 산업표준이다.
  • 따라서 한글도 당연하게 표현가능하다.
  • UTF-8은 문자열 집합과 인코딩 형태를 8bit단위로 한다는 의미를 가진다.
  • UTF-8은 한 글자를 표현하기 위해 1~4byte를 사용하는데 이를 가변길이 인코딩 방식이라고 한다.

ANSI

  • ANSI는 ASCII의 확장이라고 할 수 있다.
  • ANSI는 8bit로 이루어져 있어서 256개의 문자를 표현할 수 있다.
  • 하지만 ANSI로 모든 언어를 표현할 수 없어서 Code Page라는 개념이 도입되었다.
  • 각 언어별로 Code 값을 지정하고, Code마다 다른 문자열 표를 의미하도록 약속을 한 것이다.

CP949

  • CP949는 ANSI계열의 한글 인코딩 방식이다.
  • CP949는 Code Page 949의 줄임말이고, 949는 한국을 의미한다.
  • 유닉스계열의 완성형 코드 조합 인코딩방식인 EUC-KR을 확장하여 만든것이다.
  • EUC-KR로는 표현할 수 있는 문자에 한계가 있었기 때문이다.
  • CP949는 윈도우즈 계열에서 사용나온것이고, 마이크로소프트가 EUC-KR을 확장하여 만든것이라서 MS949라고 부르기도 한다.

https://velog.io/@ovan/File-Encoding

 

+ Recent posts