본문 바로가기

전체 글160

[네트워크] HTTP vs HTTPS | 공개키 vs 대칭키 | SSL 통신 과정 | 전자 서명 목차 HTTP vs HTTPS HTTP(HyperText Transfer Protocol)? 서로 다른 시스템들 사이에서 통신을 주고받게 하는 가장 기본적인 프로토콜입니다. 서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용합니다. 문제점: 암호화를 하지 않는다. 한편, HTTP는 서버에서 브라우저로 전송되는 정보가 암호화가 되지 않는다는 문제점을 가지고 있습니다. 그래서 누군가가 데이터를 전송하는 도중에 쉽게 가로챌 수 있습니다. HTTPS(HyperText Transfer Protocol Secure)? HTTP에 SSL(보안 소켓 계층, Secure Sockets Layer)을 사용한 프로토콜입니다. HTTP에서 데이터가 암호화되지 않는 문제점을 SSL을 활용하여 해결했습니다. SSL은 서.. 2023. 7. 27.
[effective java] item 8. finalizer와 cleaner 사용을 피하라 결론 finalizer와 cleaner은 자원 해제 시 사용하는 객체입니다. 두 객체 모두 불확실성, 성능 저하 등 많은 문제를 일으키므로 사용을 피하고, 대신 try-with-resources 로 자원으로 자원을 해제할 것을 권장합니다. 하지만, cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로 사용할 수도 있습니다. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 합니다. 설명 자바는 두 가지 객체 소멸자를 제공합니다. finalizer와 cleaner입니다. finalizer는 많은 문제의 원인이 되므로 자바 9에서 finalizer를 사용 자제(deprecated) API로 지정하고, cleaner를 그 대안으로 소개했습니다. (하지만 자.. 2023. 7. 25.
[effective java] item 7. 다 쓴 객체 참조를 해제하라 결론 메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있습니다. 다음과 같은 경우, 다 쓴 객체 참조를 명시적으로 해제하여 메모리 누수를 방지해야 합니다. 1. 메모리를 직접 관리하는 클래스 (ex) Stack) 2. 캐시에 저장된 객체 참조 3. 리스너(listener) 혹은 콜백(callback) 의 해제 설명 C, C++과 달리 자바와 같이 가비지 컬렉터가 메모리 관리를 해주는 경우, 자칫 메모리 관리에 더 이상 신경을 쓰지 않아도 된다고 오해할 수 있지만, 반드시 프로그래머가 직접적으로 참조를 해제해야 하는 경우가 있습니다. 예제 1: 메모리를 직접 관리하는 클래스 스택을 간단히 구현한 다음 코드를 봅시다. Stack - 메모리 누수 발생 (p. 36) public clas.. 2023. 7. 25.
[effective java] item 6. 불필요한 객체 생성을 피하라 결론 기존의 객체를 재사용할 수 있다면, 새로운 객체를 생성하지 마라. [재사용이 가능한 경우] 1. 기능이 같은 불변 객체 (ex) String) 2. 불변 클래스 3. 비싼 객체가 반복해서 필요한 경우 4. 어댑터 객체를 재사용할 수 있는 경우 1. 기능이 같은 불변 객체 (ex) String) 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많습니다. 특히, 불변 객체는 언제든 재사용할 수 있습니다. String 객체 생성 String s = new String("bikini"); 문장이 실행될 때마다 String 객체를 생성합니다. 생성자에 넘겨진 "bikini" 객체는 이 생성자로 만들어내려는 String과 완전히 똑같습니다. 완전히 똑같은 불필요한 객체를 계속해.. 2023. 7. 25.
[effective java] item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 결론 클래스는 다른 클래스를 의존합니다. 이때 해당 클래스가 다른 클래스를 직접 생성하게 해서는 안됩니다. 그럴 경우, 수정이 번거롭고 테스트가 하기가 어렵습니다. 대신, 필요한 의존관계를 (혹은 그 클래스 객체를 생성하는 팩토리를) 생성자에 (혹은 정적 팩토리나 빌더에) 넘겨 주도록 합시다. '의존 객체 주입'이라 하는 이 기법은 클래스의 유연성, 재사용성, 테스트 용이성을 개선해줍니다. 의존 객체 주입 패턴 - 생성자 (p. 29) public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexion distionary) { this.dictionary = Objects.requireNonNull(dictiona.. 2023. 7. 24.
[effective java] item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. 결론 클래스 중에는 인스턴스(객체)로 만들어 쓰려고 설계한 클래스가 아닌 경우도 있습니다. (ex) 정적(static) 멤버만 담은 유틸리티 클래스) 하지만, 생성자를 명시하지 않으면 컴파일러가 자동으로 public 생성자를 만들어 객체를 생성할 수 있으므로, private 생성자를 만들어 이를 방지해야 합니다. ex) 인스턴스를 만들 수 없는 유틸리티 클래스 (p. 26~27) public class UtilityClass { // 기본 생성자를 막는 private 생성자 - 인스턴스화 방지 private UtilityClass() { throw new AssertionError(); } ... // 나머지 코드는 생략 } 인스턴스화를 막고 싶은 클래스? 이따금 단순히 정적 메서드와 정적 필드만을 담은.. 2023. 7. 23.