본문 바로가기

전체 글48

[아이템 7] 다 쓴 객체 참조를 해제하라 자바는 GC가 메모리 관리를 해주긴 하지만 개발자가 메모리에 신경을 쓰지 않아도 된다는 것은 아니다. 책에서 나온 사례를 간략하게 설명해보겠다. ▶ scope에 따라 GC의 대상이 안될 수 있다. 메서드와 같은 중괄호 { } 안에 만들어진 객체 같은 경우 괄호를 빠져나오게 되면 GC 대상이 되어 수거된다. 하지만 인스턴스 변수나 전역 변수는 GC 대상이 안되기 때문에 사용하지 않는 객체라면 null을 선언해주어 GC 대상이 되도록 만들어야 메모리 낭비가 안된다. ▶ 캐시 데이터를 빠르게 접근하기 위해 캐시라는 임시 저장 공간을 사용한다. 하지만 객체를 캐시에 넣고 나서 그대로 나누면 메모리를 낭비한다. WeakHashMap 사용 : key 값이 null 되면 key, value 값을 제거한다. Sched.. 2021. 12. 23.
[아이템 6] 불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 있다. 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아진다.(GC는 애플리케이션 성능을 저하시키는 요인 중 하나) String s = new String("hi"); String s = "hi"; String s = new String("hi"); 정확하진 않지만 "hi"라는 문자열은 리터럴 스트링 풀에 저장이 될 것이고, new String()을 호출할 때마다 heap 영역에 String 인스턴스가 저장이 된다. String s = "hi"; String pool에 "hi" 문자열이 저장이 되고, "hi"를 생성할 시 String pool에 있는.. 2021. 12. 21.
[아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 SpellChecker라는 맞춤법을 검사하는 클래스가 있다. 이 클래스는 Lexicon이란 사전 클래스를 의존한다. 코드는 아래와 같다. class SpellChecker { private static final Lexicon dictionary = new KoreanDictionary(); public static boolean isValid(String word) { return true; } public static List suggestions(String typo) { return new ArrayList(); } } class KoreanDictionary implements Lexicon { } interface Lexicon { } 코드에선 KoreanDictionary를 직접 생성해서 사.. 2021. 12. 20.
Spring의 @Transactional Transaction 이란 여러 쿼리를 논리적으로 하나의 작업 단위로 묶는 것을 의미한다. 예로 계좌 이체가 있다. 적어도 보내는 사람과 받는 사람의 계좌는 업데이트가 되어야 한다. 이 두 번의 DB 작업을 논리적으로 하나의 작업으로 묶는 것이다. Transaction 성질 원자성 : 트랜잭션의 쿼리 결과들이 모두 반영되거나, 모두 반영되지 않아야 한다. 일관성 : 트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다. 격리성 : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야 한다. 지속성 : 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다. Spring의 @Transactional Mybatis, hiberbate, jdbcTemplate 디비 접근 기술에 따라 트랜잭션을 적용.. 2021. 12. 15.
JDK Dynamic Proxy와 CGLIB 저번 글은 AOP에 대해서 작성했었습니다. 이번 글을 Spring에서 제공하는 JDK Dynamic Proxy와 CGLib에 대해서 알아보겠습니다. 둘의 공통점은 Proxy를 통해 AOP를 제공한다는 것입니다. Proxy란 추가적인 기능을 추가해 실제 Target 객체의 기능을 호출하는 객체를 뜻합니다. 쉽게 말하기가 어렵네요. 간단히 Proxy 예를 보겠습니다. public interface ITarget { void sayHi(); } public class Target implements ITarget { @Override public void sayHi() { System.out.println("Hi"); } } public class Proxy implements ITarget { ITarget.. 2021. 12. 7.
Spring AOP AOP란 Aspect Oriented Programming의 줄임말로 관점 지향 프로그래밍이란 뜻입니다. 쉽게 말하자면 핵심 로직과 부가 로직을 분리하는 것입니다. 핵심 로직이란 실제 처리하고자 하는 로직이고 부가 로직이란 핵심 로직의 위아래로 반복적으로 나타나는 로직을 뜻합니다. 대표적인 예로 Transaction을 볼 수 있습니다. 일반적으로 트랜잭션을 적용하기 위해 AutoCommit을 해제한 후 핵심 로직을 작성합니다. 그리고 마지막 부분에 핵심 로직이 정상적으로 수행이 되었다면 Commit, 그렇지 않다면 Rollback을 시킵니다. public void transactionFunc() throws SQLException { Connection connection = null; try { con.. 2021. 12. 2.
728x90