목록전체 글 (302)
elevne's Study Note
아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트들은 모두 내부 구현을 완벽히 숨겨 구현과 API 를 깔끔히 분리하며, 오직 API 를 통해서만 다른 컴포넌트와 소통한다. 정보은닉, 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 된다. 자바는 정보은닉을 위한 다양한 장치를 제공하는데, 접근 제한자가 대표적이며 이를 제대로 활용하는 것이 캡슐화의 핵심인 것이다. 기본 원칙은, 모든 클래스와 멤버의 접근성을 가능한 한 좁히는 것이다. 탑 레벨의 클래스와 인터페이스에는 public 혹은 package-private (package-private 는 아무런 접근제어자를 붙여주지 않으면 자동으로 설정됨) 를 부여해줄 수 있다. public 으로 선언하면 공개 API 가 되고, pack..

Object 는 객체를 만들 수 있는 구체 클래스이지만, 기본적으로는 상속해서 사용하도록 설계되어있다. Object 에서 final 이 아닌 메소드 (: equals, hashCode, toString, clone, finalize) 는 모두 오버라이드를 염두에 두고 설계된 것으로, 정의 시 지켜야하는 일반 규약이 명백히 정의되어 있다. 메소드를 잘못 구현하면 대상 클래스가 이 규약을 준수한다고 가정하는 HashMap, HashSet 과 같은 클래스를 오작동하게 만들 수 있다. 아이템 10. equals 는 일반 규약을 지켜 재정의하라 equals 메소드는 재정의할 때 주의해야할 점들이 많다고 한다. 아래에 해당하는 상황 중 하나라면, 재정의하지 않는 편이 최선이라고 한다. 각 인스턴스가 본질적으로 고유..

전체텍스트 검색은 긴 문자의 텍스트를 빠르게 검색하기 위한 기능이다. 아래와 같은 쿼리를 통해 데이터를 조회하려는 경우가 생길 것이다. SELECT * FROM testTbl WHERE columnA LIKE '%교통%'; 이렇게하면 '교통'이라는 글자는 들어간 모든 기사가 검색되는데, 문제는 이 상황에서는 인덱스를 사용할 수 없다는 것이다. '%교통%' 은 텍스트의 중간에 들어있으므로 인덱스를 사용할 방법이 없으며, MySQL 은 전체 테이블 검색을 하게된다. (매우 오래걸린다...) 전체 텍스트 검색은 이 문제를 해결해준다. 전체 텍스트 검색은 첫 글자 뿐만 아니라 중간의 단어나 문장으로도 인덱스를 생성해주기 때문에 이러한 상황에서도 인덱스를 사용할 수 있어 순식간에 검색결과를 얻을 수 있다. 전체텍..

아이템 1. 생성자 대신 정적 팩토리 메소드를 고려해라 클래스의 인스턴스를 얻을 때 public 생성자를 사용할 수도 있지만, 생성자와 별도로 정적 팩토리 메소드를 사용해볼 수도 있다. 해당 클래스의 인스턴스를 반환하는 단순한 정적메소드이다. 정적 팩토리 메소드를 사용하는 장단점이 존재한다. 장점 이름을 가질 수 있다: 정적 팩토리 메소드의 이름을 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. BigInteger.probablePrime 과 같이, 값이 소수인 BigInteger 을 반환한다는 것이 명확하게 보이게끔 작성할 수 있는 것이다. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다: 불변클래스(immutable class)는 인스턴스를 미리 만들어두거나 새로 생성한 인스턴스를 캐싱하..

인덱스는 튜닝에 즉각적인 효과를 내는 가장 빠른 방법 중 하나로, 인덱스를 생성하고 인덱스를 사용하는 SQL 을 만들어서 사용한다면 기존보다 아주 빠른 응답 속도를 얻을 수 있다. 인덱스를 만들어서 발생되는 장점을 아래와 같다. 검색 속도가 빨라질 수 있다 (항상 그런 것은 아니다) 결과적으로 쿼리의 부하가 줄어들어 시스템 전체의 성능이 향상된다. 하지만 단점도 존재한다. 인덱스가 데이터베이스의 공간을 차지하여 추가적인 공간이 필요해지는데, 대략 데이터베이스 크기의 10% 정도의 추가공간이 필요하다. 처음 인덱스를 생성하는데 시간이 많이 소요될 수 있다. 데이터의 변경작업이 자주 일어나는 경우에는 오히려 성능이 나빠질 수 있다. 인덱스의 종류는 크게 두 가지로 나뉜다. 클러스터형 인덱스와 보조인덱스이다...

이번에는 Spring 에서 자주 사용되는 편리한 애노테이션들에 대해 알아볼 수 있었다. @Resource @Configuration 을 사용하는 클래스 내에서 @Resource 애노테이션을 사용하기도 한다. 이는 @Autowired 와 비슷하게 필드에 빈을 주입받을 때 사용하는데, 차이점으로 @Autowired 는 필드의 타입을 기준으로 빈을 찾고 @Resource 는 필드 이름을 기준으로 빈을 찾는다. @Resource Database embeddedDatabase; @EnableTransactionManagement 이전 시간에도 알아보았듯이 @EnableTransactionManagement 를 사용하여 트랜잭션 AOP 를 활성화시켜줄 수 있다. 만약 이를 달아주지 않는다면 다음 네 가지 클래스를 ..

Trigger 은 테이블에 무슨 일이 일어나면 자동으로 실행되는 작업이다. 테이블에 삽입, 수정, 삭제 등의 작업(이벤트) 발생 시에 자동으로 작동되는 개체로, Stored Procedure 과 비슷한 모양을 가진다. 트리거로 많이 사용되는 예로는, 데이터 삭제 시에 사용되는 트리거이다. 만약 누군가가 어느 테이블의 행을 고의 또는 실수로 삭제한다면, 삭제된 행의 내용을 복구하는 것도 어려우며 누가 지웠는지 추적하는 것도 어렵다. 이러한 경우 A 테이블에서 행이 삭제되는 순간에 삭제된 행의 내용, 시간, 삭제한 사용자 등을 다른 테이블에 기록해 둠으로써 이를 해결할 수 있다. 트리커는 제약조건들과 더불어 데이터 무결성을 위해 MySQL 에서 활용할 수 있는 또다른 기능이다. 트리거는 스토어드 프로시저와..

Stored Procedure 이란 MySQL 에서 제공되는 프로그래밍 기능이며, 쿼리문의 집합으로 어떠한 동작을 일괄처리하기 위한 용도로 사용된다. 아래는 Stored Procedure 을 생성하는 간단한 형식이다. CREATE PROCEDURE 프로시저이름( IN 또는 OUT 파라미터 ) BEGIN --- SQL 프로그래밍 코드 --- END 위 형식에 맞추어 생성한 프로시저는 CALL 프로시저이름() 으로 호출할 수 있다. 프로시저를 삭제할 때에는 DROP PROCEDURE 을 사용하면 된다. Stored Procedure 은 실행 시에 입력 매개변수를 지정할 수 있다. 입력된 매개변수는 Stored Procedure 내부에서 다양한 용도로 사용될 수 있다. 입력 매개변수를 지정할 때는 아래와 같이..