• 스프링 입문을 위한 자바 객체 지향의 원리와 이해

  • 김종민 지음

  • 오픈소스 & 웹 시리즈_069
  • ISBN: 9788998139940
  • 25,000원 | 2015년 04월 8일 발행 | 396쪽



자바에서 스프링으로 나아가기 위한 연결 고리를 제공해 드립니다!

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 애플리케이션 프레임워크인 스프링은 자바와 객체 지향이라는 기반 위에 굳건히 세워져 있다. 따라서 스프링을 제대로 이해하고 활용하려면 먼저 자바와 객체 지향부터 올바르게 이해해야 한다.

모든 기술은 갑자기 하늘에서 뚝 떨어진 것이 아니다. 이전 기술의 어깨를 디딤돌 삼아 그 위에 이전 기술이 제시한 철학과 기법을 정반합의 논리로 정제하고, 이전 기술을 거름 삼아 새로운 철학과 기법을 더해 나타난다. 스프링 또한 이전 기술과 개념에서 좋은 점들을 집대성하고 거기에 자신만의 철학과 기법을 더해 자타가 인정하는 현존 최강의 프레임워크로 발전했다. 따라서 스프링을 학습하고 적용하려면 스프링의 근간이기도 한 이전 기술과 개념에 대한 최소한의 이해가 필요하다. 그리고 스프링의 근간을 이루는 핵심에는 객체 지향 특성과 설계 원칙, 디자인 패턴이 자리 잡고 있다.

 

책 속으로

스프링에 입문하는 초급자는 스프링을 학습하거나 적용하는 데 어려움을 호소하고 있다. 그렇다면 스프링은 정말로 어려운 것일까? 누가 필자에게 스프링이 무엇인지 물어보면 주저 없이 객체 지향 프로그래밍(OOP) 프레임워크라고 답하곤 한다. 객체 지향 프로그래밍에 대한 올바른 지식을 갖추지 않은 상태에서 스프링을 이해한다는 것은 어불성설이다. 알파벳도 모르는 상태에서 영어를 마스터하고자 하는 욕심과 별반 다르지 않다. 스프링은 객체 지향 프로그래밍(OOP; Object-Oriented Programming)을 활용했던 기존 기술 중 가장 좋은 철학과 기법을 모아 그 정수를 뽑아낸 결정체라 할 수 있다.

모든 기술은 갑자기 하늘에서 뚝 떨어진 것이 아니다. 이전 기술의 어깨를 디딤돌 삼아 그 위에 이전 기술이 제시한 철학과 기법을 정반합의 논리로 정제하고, 이전 기술을 거름 삼아 새로운 철학과 기법을 더해 나타난다. 스프링 또한 이전 기술과 개념에서 좋은 점들을 집대성하고 거기에 자신만의 철학과 기법을 더해 자타가 인정하는 현존 최강의 프레임워크로 발전했다. 따라서 스프링을 학습하고 적용하려면 스프링의 근간이기도 한 이전 기술과 개념에 대한 최소한의 이해가 필요하다. 그리고 스프링의 근간을 이루는 핵심에는 객체 지향 특성과 설계원칙, 디자인 패턴이 자리 잡고 있다.

이 책에서는 본격적인 스프링 학습을 위한 사전 지식, 즉 스프링의 근간이 되는 객체 지향 4 대 특성, 객체 지향 설계 5원칙, 스프링에서 많이 활용되고 있는 디자인 패턴을 학습하고 이 해하는 것을 목표로 한다.

-- 저자 서문 중에서

김종민

빅데이터와 GIS 기반 스타트업인 UISCLOUD의 수석 프로그래머이자 동양미래대학교 컴퓨터공학부 겸임 교수다. HTML5와 AngularJS, 스프링 MVC, 스프링 부트 등 스프링 관련 프로젝트에 관심이 많고 Clojure의 매력에도 푹 빠져 지내고 있으며, 먼 훗날 “개발자로 태어나 개발자로 살다 개발자로 죽었다”라는 문구로 기억되고 싶은 욕망이 있다.

  • ▣ 01장: 사람을 사랑한 기술
    • 신기술은 이전 기술의 어깨를 딛고
    • 기계어에서 객체 지향 프로그래밍 언어로
      • 기계어-0과 1의 행진 / 너무나 비인간적인 언어
      • 어셈블리어-0과 1의 행진을 벗어나 인간 지향으로 / 기계어 니모닉
      • C 언어-강력한 이식성 / One Source Multi Object Use Anywhere
      • C++ 언어-정말 인간적인 프로그래밍 방법론, 객체 지향
      • 자바 - 진정한 객체 지향 언어
      • 신기술은 이전 기술의 어깨를 딛고 개발자를 위해 발전한다
      • 신기술이 역사 속에서 환영만 받은 것은 아니다
    • 짧은 글, 긴 생각
      • UML을 대하는 자세
      • 당신은 CBD, SOA가 어려운가?
      • 객체 지향의 4대 특성을 누군가에게 설명할 수 있는가?
      • 스프링 프레임워크는 사상이면서 또 단일 제품이다
    • 책 출간의 변
    •  
  • ▣ 02장: 자바와 절차적/ 구조적 프로그래밍
    • 자바 프로그램의 개발과 구동
      • 자바에 존재하는 절차적/구조적 프로그래밍의 유산
      • 다시 보는 main() 메서드: 메서드 스택 프레임
    • 변수와 메모리: 변수! 너 어디 있니?
    • 블록 구문과 메모리: 블록 스택 프레임
    • 지역 변수와 메모리: 스택 프레임에 갇혔어요!
    • 메서드 호출과 메모리: 메서드 스택 프레임 2
    • 전역 변수와 메모리: 전역 변수 쓰지 말라니까요!
    • 멀티 스레드 / 멀티 프로세스의 이해
    • STS(또는 이클립스)를 이용해 T 메모리 영역 엿보기
    • 정리 - 객체 지향은 절차적/구조적 프로그래밍의 어깨를 딛고
    •  
  • ▣ 03장: 자바와 객체 지향
    • 객체 지향은 인간 지향이다
    • 객체 지향의 4 대 특성 - 캡! 상추다
    • 클래스 vs. 객체 = 붕어빵틀 vs. 붕어빵 ???
    • 추상화: 모델링 82
      • 추상화는 모델링이다
      • 추상화와 T 메모리
      • 클래스 멤버 vs. 객체 멤버 = static 멤버 vs. 인스턴스 멤버
    • 상속: 재사용 + 확장
      • 상속의 강력함
      • 상속은 is a 관계를 만족해야 한다?
      • 다중 상속과 자바
      • 상속과 인터페이스
      • 상속과 UML 표기법
      • 상속과 T 메모리
    • 다형성: 사용편의성
      • 오버라이딩? 오버로딩?
      • 다형성과 T 메모리
      • 다형성이 지원되지 않는 언어
    • 캡슐화: 정보 은닉
      • 객체 멤버의 접근 제어자
    • 참조 변수의 복사
    • 정리 - 자바 키워드와 OOP 4 대 특성
    •  
  • ▣ 04장: 자바가 확장한 객체 지향
    • abstract 키워드 - 추상 메서드와 추상 클래스
    • 생성자
    • 클래스 생성 시의 실행 블록, static 블록
    • final 키워드
      • final과 클래스
      • final과 변수
      • final과 메서드
    • instanceof 연산자
    • package 키워드
    • interface 키워드와 implements 키워드
    • this 키워드
    • super 키워드
    • 예비 고수를 위한 한마디
    • 정리 - 자바 키워드와 OOP 확장
    •  
  • ▣ 05장: 객체 지향 설계 5원칙 - SOLID
    • SRP - 단일 책임 원칙
    • OCP - 개방 폐쇄 원칙
    • LSP - 리스코프 치환 원칙
    • ISP - 인터페이스 분리 원칙
    • DIP - 의존 역전 원칙
    • 정리 - 객체 지향 세계와 SOLID
    •  
  • ▣ 06장: 스프링이 사랑한 디자인 패턴
    • 어댑터 패턴(Adapter Pattern)
    • 프록시 패턴(Proxy Pattern)
    • 데코레이터 패턴(Decorator Pattern)
    • 싱글턴 패턴(Singleton Pattern)
    • 템플릿 메서드 패턴(Template Method Pattern)
    • 팩터리 메서드 패턴(Factory Method Pattern)
    • 전략 패턴(Strategy Pattern)
    • 템플릿 콜백 패턴(Template Callback Pattern - 견본/회신 패턴)
    • 스프링이 사랑한 다른 패턴들
    •  
  • ▣ 07장: 스프링 삼각형과 설정 정보
    • IoC/DI - 제어의 역전/의존성 주입
      • 프로그래밍에서 의존성이란?
      • 스프링 없이 의존성 주입하기 1 - 생성자를 통한 의존성 주입
      • 스프링 없이 의존성 주입하기 2 - 속성을 통한 의존성 주입
      • 스프링을 통한 의존성 주입 - XML 파일 사용
      • 스프링을 통한 의존성 주입 - 스프링 설정 파일(XML)에서 속성 주입
      • 스프링을 통한 의존성 주입 - @Autowired를 통한 속성 주입
      • 스프링을 통한 의존성 주입 - @Resource를 통한 속성 주입
      • 스프링을 통한 의존성 주입 - @Autowired vs. @Resource vs. 태그
    • AOP - Aspect? 관점? 핵심 관심사? 횡단 관심사?
      • 일단 덤벼 보자 - 실전편
      • 일단 덤벼 보자 - 설명편
      • 일단 덤벼 보자 - 용어편
      • 일단 덤벼 보자 - POJO와 XML 기반 AOP
      • AOP 기초 완성 310
    • PSA - 일관성 있는 서비스 추상화
    •  
  • ▣ 부록A: 스프링 MVC를 이용한 게시판 구축
    • A.1 URL과 @RequestMapping 연결하기
    • A.2 인메모리 DB HSQL 사용하기
    • A.3 VO와 MyBatis를 이용한 DAO 구현
    • A.4 서비스(Service) 구현
    • A.5 목록 구현
    • A.6 읽기 구현
    • A.7 새 글 구현
    • A.8 수정 구현
    • A.9 삭제 구현
    • A.10 리팩터링
    •  
  • ▣ 부록B: 자바 8 람다와 인터페이스 스펙 변화
    • B.1 람다가 도입된 이유
    • B.2 람다란 무엇인가?
    • B.3 함수형 인터페이스
    • B.4 메서드 호출 인자로 람다 사용
    • B.5 메서드 반환값으로 람다 사용
    • B.6 자바 8 API에서 제공하는 함수형 인터페이스
    • B.7 컬렉션 스트림에서 람다 사용
    • B.8 메서드 레퍼런스와 생성자 레퍼런스
    • B.9 인터페이스의 디폴트 메서드와 정적 메서드
    • B.10 정리
  • 28쪽, 표 1-5, 다음 그림과 같이 들여쓰기를 적용

    java-to-spring-p28.jpg

  • 43쪽, 그림 2-5 캡션

    java.lang 패키지 배치

    ==>

    java.lang 패키지를 T 메모리 스태틱 영역에 배치

  • 55쪽, 밑에서 8번째 줄

    그런데 T 메모리는 구역이 세 군데에 있는데

    ==>

    그런데 T 메모리는 세 개의 영역이 있는데

  • 73쪽, 2번째 줄

    스택 프레임 현황 정보가 화면 상단에

    ==>

    스택 프레임 지역 변수 현황 정보가 화면 상단에

  • 82쪽, 2번째 줄

    그래서 김연아와 펭귄은 객체다.

    ==>

    그래서 김연아와 뽀로로는 객체다.

  • 101쪽, 밑에서 9번째 줄

    선입출구조, LIFO,

    ==>

    선입출구조, LIFO,

  • 104쪽, 본문 밑에서 2번째 줄

    정리해 보면 추상화를 통해 모델링을

    ==>

    결국 추상화를 통해 모델링을

  • 106쪽, 그림 3-22, 다음 그림으로 대체

    그림 3-22

  • 138쪽, 그림 3-38 제목

    접근 제어자

    ==>

    접근 제어자(private인 경우 같은 클래스의 객체끼리는 서로 접근 가능. 참고: equals, compareTo 메서드)

  • 157쪽, 본문 7번째 줄

    클래스의 인스턴스를 만들 때

    ==>

    클래스의 인스턴스를 최초로 만들 때

  • 157쪽, 본문 밑에서 2번째 줄

    JUnit의 @Before 클래스 어노테이션을

    ==>

    JUnit의 @BeforeClass 어노테이션을

  • 202쪽, 그림 6-1 내 텍스트

    AdapterPattern.ClientWithAdapter

    ==>

    AdapterPattern.ClientWithNoAdapter

  • 203쪽, 본문 첫 번째 줄

    ServiceB의 메서드를 service()라고 하는

    ==>

    ServiceB의 메서드를 runService()라고 하는

  • 204쪽, 본문 첫 번째 줄

    변환기를 통해 service()라는 동일한

    ==>

    변환기를 통해 runService()라는 동일한

  • 208쪽, 본문 밑에서 7번째 줄

    의존 역전 법칙(DIP)도 생각이 날 것이다. 예제에서 살펴본 프록시 패턴이 개방 폐쇄 원칙과 의존 역전 법칙이 적용된 설계 패턴이기 때문이다.

    ==>

    의존 역전 원칙(DIP)도 생각이 날 것이다. 예제에서 살펴본 프록시 패턴이 개방 폐쇄 원칙과 의존 역전 원칙이 적용된 설계 패턴이기 때문이다.

  • 259쪽, 예제 7-18는 다음 코드로 대체

    package expert002;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    public class CarTest {
     @Test
     public void 자동차_코리아타이어_장착_타이어브랜드_테스트() {
      Tire tire1 = new KoreaTire();
      Car car1 = new Car();
      car1.setTire(tire1);
    
      assertEquals("장착된 타이어: 코리아 타이어", car1.getTireBrand());
     }
    
     @Test
     public void 자동차_미국타이어_장착_타이어브랜드_테스트() {
      Tire tire2 = new AmericaTire();
      Car car2 = new Car();
      car2.setTire(tire2);
    
      assertEquals("장착된 타이어: 미국 타이어", car2.getTireBrand());
     }
    }
    
  • 260쪽, 본문 밑에서 2번째 줄

    XML 파일을 변경하고 웹 컨테이너를 재구동하면 바로 변경사항이 적용된다.

    ==>

    XML 파일을 변경하고 프로그램을 실행하면 재구동하면 바로 변경사항이 적용된다.

  • 273쪽, 본문 4번째 줄

    유일한 빈을 선택을 할 수 없다면

    ==>

    유일한 빈을 선택할 수 없다면

  • 341쪽, 페이지 하단의 다음 import 구문 삭제

    import org.springframework.web.bind.annotation.RequestMapping;

    ==>

    (삭제)

  • 303쪽, 본문 밑에서 5번째 줄

    타깃 메서드 지정자에는 익히 알려진 정규식과 AspectJ 표현식 등을 사용할 있다. 간단하게 소개하자면 다음과 같다.

    ==>

    타깃 메서드 지정자에는 익히 알려진 정규식과 AspectJ 표현식 등을 사용할 있다. 간단하게 소개하면 다음과 같다.

  • 329쪽, 밑에서 두 번째 줄

    설정 파일인 sqlmap-config.xml을 ==> 설정 파일인 mybatis-config.xml

  • 330쪽, 예제 A-13 제목

    [예제 A-13] sqlmap-config.xml ==> [예제 A-13] mybatis-config.xml

  • 339쪽, 2번째 줄

    열어 보면 예제 A-2와 같은 부분을

    ==>

    열어 보면 예제 A-21과 같은 부분을

  • 389쪽, 2번째 줄

    사용할 수 있다는 결론을 의미한다.

    ==>

    사용할 수 있다는 것을 의미한다.

  • 394쪽, CGLib 인덱스 항목 중복

    CGLib 288과 CGLiB 300을 CGLib 288, 300으로 수정

예제코드 관련 깃허브 페이지

관련 글