개인 공부

개인 공부/Java

[오브젝트] 객체지향설계

나는 지금까지 서비스를 개발하기 위해 설계할 때 데이터 위주로 설계했던 것 같다. 필요한 객체들과 그 필드 값들을 미리 생각하고 설계한 뒤 책임을 부여하는 방식이다. 그렇게되면, 고립된 객체의 상태에 초점을 맞추기 때문에 캡슐화를 위반하기 쉽고, 결합도가 높아지며 응집도가 낮아질 확률이 높다. 그럼 코드를 변경하기 어려워지고 유지보수가 힘들어지게 된다. 책 오브젝트에서는 이러한 문제점을 해결하기 위해서는 데이터가 아닌 책임에 초점을 맞추어야 한다고 말한다. GRSAP 패턴을 사용하면 책임 할당의 어려움을 해결하기 위한 답을 준다고 한다. 책임 주도 설계를 위해서는 다음의 두가지 원칙을 따라야 한다. 데이터보다 행동을 먼저 결정하라 협력이라는 문맥 안에서 책임을 결정하라 데이터보다 행동을 먼저 결정하라. ..

개인 공부/스터디

[Real MySQL] 인덱스

👊🏻 랜덤 I/O 와 순차 I/O 인덱스의 성능에 대해서 제대로 이해하기 위해서는 랜덤 I/O 와 순차 I/O에 대해서 알아볼 필요가 있다. 랜덤 I/O 라는 표현은 디스크 드라이브의 플래터를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미한다. 사실 순차 I/O 또한 이 작업은 같다. 디스크에 데이터를 쓰고 읽는데 걸리는 시간과 비용은 결국 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정난다. 책에서 나온 예제에는 3개의 페이지 블록을 디스크에 기록하기 위해 순차 I/O는 1번의 시스템 콜을 요청했지만 랜덤 I/O는 3번의 시스템 콜을 요청했다. 해당 예제의 경우 순차 I/O가 랜덤 I/O보다 3배 정도 빠르다고 볼 수 있다. 쿼리를 튜닝해서 ..

개인 공부/스터디

[이펙티브 자바] 열거타입과 인터페이스

🏠 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 기본적으로 열거 타입은 기존 상수를 그대로 가져와, 새롭게 추가하여 다른 목적으로 사용할 수 없다. 그런데 확장할 수 있는 열거 타입의 쓰임이 어울리는 경우가 하나는 있는데, 그건 바로 연산 코드이다. 연산 코드의 각 원소는 특정 기계가 수행하는 연산을 뜻한다. ( 예를 들어 계산기 ) 가끔 API가 제공하는 기본 연산 외에 사용자마다 확장 연산을 추가해줘야 할 때가 있다. 이때 사용할 수 있는게 바로 열거 타입이다. 열거 타입은 임의의 인터페이스를 구현할 수 있다. 연산 코드용 인터페이스를 정의하고, 열거 타입이 해당 인터페이스를 구현하면 된다. 그러면 열거 타입이 인터페이스의 표준 구현체 역할을 한다. public interface Ope..

개인 공부/스터디

[이펙티브 자바] 열거(enum) 타입

🏠 int 상수 대신 열거 타입을 사용하라. 열거 타입이란 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 사계절, 태양계 행성, 카드게임 종류처럼 정해진 개수가 있다면 좋은 예시가 될 수 있다. 열거 타입이 나오기 전에는 정수 상수를 묶음으로 선언해서 사용했다. public static final int APPLE_A = 0; public static final int APPLE_B = 1; public static final int APPLE_C = 2; public static final int BANANA_D = 0; public static final int BANANA_E = 1; public static final int BANANA_F = 2; 다음과 같은 정수..

개인 공부/에러 해결

[해결완료] Security 403 에러

프로젝트에 적용한 security 에서 올바른 결과값을 반환해야 하는 API 가 403 에러를 리턴하는 것으로 확인되었다. 로그인 후 올바른 토큰을 헤더에 실어 시험 조회 요청을 보냈지만, 403 에러를 뱉은 것이다. 게다가 쿼리는 실행되는데, 로직의 break point 는 걸리지도 않았다. ☠️ csrf ? 구글링을 해본 결과 인가처리를 따로 하지 않은 시큐리티의 403 에러의 대부분은 csrf 때문으로 확인되었다. CSRF(Cross-Site Request Forgery)는 웹 보안 취약점으로, 공격자가 사용자를 속여 의도하지 않은 작업을 수행하게 만드는 공격이다. 해당 공격은 다른 웹사이트 간의 상호 간섭을 방지하기 위해 설계된 동일 출처 정책을 부분적으로 우회할 수 있다. 웹 애플리케이션을 개발..

개인 공부/스터디

[이펙티브 자바] 제네릭 메서드 작성법

🏠 이왕이면 제네릭 메서드로 만들라. 매개변화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭이다. Collections 의 알고리즘 메서드 (이진검색, 정렬 등) 은 모두 제네릭일 것이다. public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 제네릭 메서드를 만드려면, 메서드 선언에서의 세 집합( 입력 2개, 반환 1개 )의 원소 타입을 타입 매개변수로 명시하고, 메서드 안에서도 이 타입 매개변수만 사용하게끔 수정하면 된다. 타입 매개변수 목록은 메서드 제한자와 반환 타입 사이에 온다. 때문에 public static 과 반환 타입 Set 사이에 타입 매개변수 목록..

개인 공부/스터디

[이펙티브 자바] 제네릭

🏠 로 타입은 사용하지 말자. 제네릭 클래스란 클래스 선언에 타입 매개변수가 사용된 클래스이다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 클래스 이름이 나온 후, 꺽쇠괄호 안에 실제 타입 매개변수들을 나열한다. List 은 원소의 타입이 String 인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String이 정규타입 매개변수 E에 해당하는 실제 타입 매개변수이다. 제네릭 타입을 하나 정의하면 그에 해당하는 로 타입도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 정의한다. List 에서 타입 매개변수 String 을 사용하지 않는 List 가 바로 로 타입이다. 로 타입은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작한다. 로 타입을..

개인 공부/스터디

[이펙티브 자바] 인터페이스의 용도

🏠 인터페이스는 타입을 정의하는 용도로만 사용하라. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기하는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다. 💊 잘못된 예시 ( 상수 인터페이스 ) 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예시다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아닌, 내부 구현에 해당한다. 때문에 상수 인터페이스를 구현하는 것은 해당 내부 구현을 클래스의 API로 노출하는 행위이다. 이는 혼란을 줄 수 있을 뿐만 아니라, 클라이언트 코드가 내부 구현에 해당하는 상수들에 종속될 수 있다. 이로서 더는 쓰지 않게 되더라고,..

Da2isy
'개인 공부' 카테고리의 글 목록 (3 Page)