본문 바로가기

Programming

(208)
스프링3 싱글톤 레지스트리와 오브젝트 스코프 싱글톤 레지스트리와 오브젝트 스코프DaoFactory를 직접사용하는 것과 @Configuration 애노테이션을 추가해서 스프링의 애플리케이션 컨텍스트를 통해 사용하는 것은 테스트 결과만 보면 동일한 것 같다.하지만 스프링의 애플리케이션 컨텍스트는 기존에 직접 만들었던 오브젝트 팩토리와는 중요한 차이점있다. 오브젝트의 동일성과 동등성자바에서 두 개의 오브젝트가 같은거라는 말은 주의해서 써야한다.자바에서는 두 개의 오브젝트가 완전히 같은 동일한(identical) 오브젝트라고 말하는 것과 동일한 정보를 담고 있는 (equivalent) 오브젝트라고 말하는 것은 분명한 차이가 있다.동일성(identity)비교와 동등성(equality)비교라고 한다.동일성은 == 연산자로, 동등성은 equals() 메서드로 ..
스프링3 제어의 역전(IoC) 스프링3 제어의 역전 IoC(inversion of Control) 팩토리객체의 생성방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 역할을 하는 오브젝트를 팩토리라고 부른다.단지 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용하는 것이다.어떻게 만들지와 어떻게 사용할지는 분명 다른 관심이다. 예) 팩토리 역할 맡을 클래스 DaoFactorypublic class DaoFactory {public UserDao userDao {ConnectionMaker connectionMaker = new DConnectionMaker();UserDao userDao = new UserDao(connectionMaker);return userDao;}} 예) ..
리팩토링 관련 문제 리팩토링 관련 문제들 데이터베이스수많은 비즈니스 애플리케이션은 바탕이 되는 데이터베이스 스키마와 강력히 결합되어 있다.이 때문에 데이터베이스 수정이 어려워지는 것이다.또 다른 이유로는 데이터 이전 문제를 들 수 있다.아무리 데이터베이스 스키마와 객체 모델의 상호 의존성을 최소화하려고 시스템을 꼼꼼하게 계층 구주로 제작했더라도, 데이터베이스 스키마를 수정하면 데이터도 이전해야 하는데, 이것은 시간도 오래 걸릴 뿐아니라 위험성도 높다.데이터 이전 작업은 오래 걸릴수 있으며, 일부 시스템에서는 스키마를 정기적으로 수정하는 일이 불가능할 수도 있다.이 문제를 해결하기 위해 객체 모델과 데이터베이스 모델 사이에 별도 소프트웨어 계층을 두는 방법이 있다.이렇게 하면 두 모델이 생긴 변경 사항을 따로 유지할 수 있어..
스프링3 개론 스프링스프링이 자바에서 가장 중요하게 가치를 두는 것이 객체지향 프로그래밍이 가능한 언어라는 점스프링이 가장 관심을 많이 두는 대상은 오브젝트.스프링을 이해하려면 오브젝트에 깊은 관심을 가져야한다.오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용방법을 넘어서 오브젝트의 설계로 발전하게 된다.객체지향 설계의 기초와 원칙을 비롯해서,다양한 목적을 위해 재활용 가능한 설계방법인 디자인 패턴좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업 리팩토링오브젝트가 기대한 대로 동작하고 있는지 효과적으로 검증하는 데 쓰이는 단위 테스트 등오브젝트 설계와 구현에 관한 여러가지 응용 기술과 지식이 요구된다. 관심사의 분리소프트웨어 개발에서 끝이란 개념은 없다.사용자의 비즈니스 프로세스와 그에 따른 요구사항은 끊..
리팩토링 리팩토링 개론리팩토링-겉으로는 드러나는 기능은 그대로 둔채, 알아보기 쉽고 수정하기 간편하게 소프트웨어 내부를 수정하는 작업(명사적)-리팩토링 기법을 연달아 적용해서 겉으로 들어나는 기능은 그대로 둔 채 소프트웨어 구조를 변경하는 것(동사적) 리팩토링의 목적1. 소프트웨어를 더 이해하기 쉽고 수정하게 쉽게 만드는 것.2. 겉으로 드러나는 소프트웨어 기능에 영향을 주지 않고 기능을 추가할때는 코드를 수정하지말고 기능만 추가해야한다.리팩토링을 할때는 코드를 추가하지 말고 코드 구조 개선만 해야한다. 리팩토링은 왜?리팩토링을 실시하지 않으면 프로그램 설계는 점점 노후된다.코드를 수정하거나 코드의 설계를 완벽히 이해하지 않고 코드를 수정하면, 코드 구조가 뒤죽박죽되어 그 코드를 보고 설계를 파악하기 어려워진다...
자바 8 #스트림(Stream) 종류와 함수형 인터페이스 기본 타입 스트림정수를 래퍼 객체로 감싸는 일이 명백히 비효율적인데도 불구하고 정수들을 Stream로 모았다.래퍼 객체의 비효율성은 다른 기본타입인 double, float, long, short, char, byte, boolean의 경우도 마찬가지다.스트림 라이브러리는 기본 타입 값들을 직접 저장하는 데 특화된 타입인 IntStream, LongStream, DoubleStream을 포함한다.short, char, byte, boolean 타입을 저장할려면 IntStream을 사용하고, float인 경우는 DoubleStream을 사용한다.라이브러리 설계자들은 이들 나머지 5개 스트림 타입을 추가할 가치가 있다고 생각하지 않았다. IntStream을 생성하려면 IntStream.of 와 Arrays...
자바 8 #스트림(Stream) 관련 메서드 filter, map, flatMap 메서드스트림 변환은 한 스트림에서 데이터를 읽고, 변환된 데이터를 다른 스트림에 넣는다.이미 특정 조건과 일치하는 모든 요소를 담은 새로운 스트림을 돌려주는 filter변환 List wordList = ...;Stream words = worlList.stream();Stream longWords = words.filter(w -> w.length() > 12); filter의 인자는 Predicate, 즉 T를 받고 boolean을 리턴하는 함수이다.스트림에 있는 값들을 특정 방식으로 변환하고 싶을 때는 map메서드를 사용하고 변환을 수행하는 함수를 파라미터로 전달한다.예) 모든 단어를 소문자로 변환Stream lowercaseWords = words.map(Str..
자바 8 #스트림(Stream) 스트림스트림은 자바8에서 연산의 스케줄링은 구현체에 맡기며, 값들의 묶음을 처리하고 원하는 작업을 지정하는데 필요한 핵심 추상화이다.예) 특정 메서드에서 리턴하는 값들의 평균을 계산하려고 한다면각 요소를 대상으로 해당 메서드를 호출하여 이 값들의 평균을 얻고 싶다고 명시한다.각 부분의 합계와 카운트를 계산하고 결과를 합치기 위해 다중 스레드를 사용해 연산을 병렬화하는 일을 스트림 라이브러리에 맡긴다. 스트림컬렉션을 처리할 때 보통은 요소들을 순회하면서 각 요소를 대상으로 작업한다.String contents = new String(Files.readAllBytes(Paths.get("c:\\alice.txt")), StandardCharsets.UTF_8); //파일을 문자열로 읽어온다.List word..