본문 바로가기
  • RATEL.SHO
[Spring]

Spring [day 1]

by ratelsho 2023. 5. 27.

스프링이 관심을 갖는 대상인 오브젝트의 설계와 구현, 동작원리를 이해하는 것이 핵심

 

1 . 1 초난감 DAO

오브젝트와 의존관계

 객체지향설계(object oriented design):

 

DAO(Data Access Object) - DB를 사용해서 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

 

자바빈(JavaBean)

- 비주얼 툴에서 조작 가능한 컴포넌트, 이제는 자바빈이라고 말하면 비주얼 컴포넌트라기보다는 두 가지 관례를 따라 만들어진 오브젝트를 가리킨다. 간단히 빈이라고 부르기도한다.

1. 디폴트 생성자 : 자바빈은 파라미터가 없는 디폴트 생성자를 갖고 있어야 한다. 툴이나 프레임워크에서 리플렉션을 이용해 오브젝트를 생성하기 때문에 필요하다.

2. 프로퍼티: 자바빈이 노출하는 이름을 가진 속성을 프로퍼티라고 한다. 프로퍼티는 set으로 시작하는 수정자 메소드(setter)와 get으로 시작하는 접근자 메소드(getter)를 이용해 수정 또는 조회할 수 있다. 

 

JDBC를 이용하는 작업의 일반적인 순서
• DB연결을위한Connection을가져온다.
• SQL을 담은 Statement(또는 Preparedstatement)를만든다.
• 만들어진 Statement를 실행한다.
• 조회의 경우 SQL쿼리의 실행결과를 ResultSet으로 받아서 정보를 저장할 오브젝트에 옮겨준다.
•작업중에생성된Connection, statement, Resultset 같은리소스는작업을마친후반드시
닫아준다.
•JDBC API가 만들어내는 예외exception를 잡아서 직접처리하거나, 메소드에 throws를 선언해서 예외가 발생하면 메소드밖으로 던지게한다.

 

main()을 이용한 DAO 테스트

- 만들어진 코드의 기능을 검증하고자 할 때 사용할 수 있는 가장 간단한 방법은 오브젝트 스스로 자신을 검증하도록 만들어주는 것


1 . 2 DAO의 분리 

관심사의 분리

객체지향의 세계에서 모든 것이 변한다. 여기서 변한다는 것은 변수나 오브젝트 필드의 값이 변한다는 것이 아니라 오브젝트에 대한 설계와 이를 구현한 코드가 변한다는 뜻이다. 소프트웨어 개발에서 끝이란 개념은 없다. 개발자가 객체를 설계할 때 가장 염두에 둬야 할 사항은 바로 미래의 변화를 어떻게 대비할 것인가이다. 객체지향 설계와 프로그래밍이 이전의 절차적 프로그래밍 패러다임에 비해 초기에 좀 더 많은, 번거로운 작업을 요구하는 이유는 객체지향 기술 자체가 지니는, 변화에 효과적으로 대처할 수 있다는 기술적인 특징 때문이다.

 

미래를 준비하는 대책

- 변화의 폭을 최소한으로 줄여주는 것, 분리와 확장을 고려한 설계 

- 변화가 한 번에 한 가지 관심에 집중돼서 일어난다면, 한가지 관심이 한 군데에 집중되게 하는 것이다.

관심사의 분리(Separation of Concerns, SoC) - 컴퓨터 프로그램을 구별된 부분으로 분리시키는 디자인원칙으로, 각 부문은 개개ㅇ의 관심사를 해결한다. 관심사 분리를 이용하면 프로그램의 설계, 디폴로이, 이용의 일부 관점에 더 높은 정도의 자유가 생긴다.  

 

중복 코드의 메소드 추출

관심의 종류에 따라 코드를 구분해놓았기 때문에 한 가지 관심에 대한 변경이 일어날 경우 그 관심이 집중되는 부분의 코드만 수정하면 된다. 관심이 다른 코드가 있는 메소드에는 영향을 주지 않을뿐더러, 관심 내용이 독립적으로 존재하므로 수정도 간단해진다.

 

변경사항에 대한 검증: 리팩토링과 테스트

메소드 추출(extract methob) - 공통의 기능을 담당하는 메소드로 중복된 코드를 뽑아내는 것

리팩토링 - 기존의 코드를 외부의 동작방식에서 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다. 코드 내부의 설계가 개선되어 코드를 이해하기가 더 편해지고, 변화에 효율적으로 대응할 수 있다. 생산성은 올라가고 코드의 품질은 높아지며, 유지보수하기 용이해지고, 견고하면서도 유연한 제품을 개발할 수 있다. 

// 리팩토링에 관해 체계적으로 잘 정리한 책 ' 리펙토링 (마틴 파울러, 켄트 백 공저)

 

상속을 통한 확장

 

템플릿 메소드 패턴(templete method pattern) - 슈퍼클래스에 기본적인 로직의 흐름(커넥션 가져오기, SQL 생성, 실행, 반환)을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법

 

팩토리 메소드 패턴(factory method pattern) - 서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것

 

- 오브젝트를 생성하는 방식이 다르다면, 팩토리 메소드 패턴으로 이해할 수 있다.

 

- 자바는 클래스의 다중상속을 허용하지 않는다. 

 


1 . 3 DAO의 확장

추상 클래스를 만들고 이를 상속한 서브클래스에서 변화가 필요한 부분을 바꿔서 쓸 수 있게 만든 이유는 바로 이렇게 변화의 성격이 다른 것을 분리해서, 서로 영향을 주지 않은 채로 각각 필요한 시점에 독립적으로 변경할 수 있게 하기 위해서이다.

 

클래스의 분리

인터페이스의 도입

두 개의 클래스가 서로 긴밀하게 연결되어 있지 않도록 중간에 추상적인 느슨한 연결고리를 만들어주는 것



추상화 - 어떤 것들의 공통적인 성격을 뽑아내어 이를 따로 분리해내는 작업, 자바가 추상화를 위해 제공하는 가장 유용한 도구는 바로 인터페이스이다.

 

 

관계설정 책임의 분리

사용되는 오브젝트를 서비스, 사용하는 오브젝트를 클라이언트라고 부를 수 있다. 오브젝트 사이의 관계는 런타임 시에 한쪽이 다른 오브젝트의 레퍼런스를 갖고 있는 방식으로 만들어진다. 

외부에서 만든 오브젝트를 전달받으려면 메소드 파라미터나 생성자 파라미터를 이용하면 된다.

 

클래스 사이의 관계는 코드에 다른 클래스 이름이 나타나기 때문에 만들어지는 것이다. 하지만 오브젝트 사이의 관계는 그렇지 않다. 코드에서는 특정 클래스를 알지 못하더라도 해당 클래스가 구현한 인터페이스를 사용했다면 그 클래스의 오브젝트를 인터페이스 타입으로 받아서 사용할 수 있다. 객체지향 프로그램에는 다형성이라는 특징이 있는 덕분이다.

 

원칙과 패턴

개방 폐쇄 원칙(OCP, Open-Closed Principle) - 깔끔한 설계를 위해 적용 가능한 객체지향 설계 원칙 중 하나이다. '클래스나 모듈은 확장에서 열려 있어야 하고 변경에는 닫혀 있어야 한다.'

높은 응집도와 낮은 결합도

개방 폐쇄 원칙은 높은 응집도와 낮은 결합도(high coherence and low coupling)라는 소프트웨어 개발의 고전적인 원리로도 설명이 가능하다. 

 

높은 응집도 - 변화가 일어날 때 해당 모듈에서 변하는 부분이 크다는 것

변경이 일어날 때 모듈의 많은 부분이 함께 바뀐다면 응집도가 높다고 말할 수 있다. 만약 모듈의 일부분에만 변경이 일어나도 된다면, 모듈전체에서 어떤 부분에는 다른 영향을 미치지는 않는지 확인해야 하는 이중의 부담이 생긴다.  

 

낮은 결합도 - 높은 응집도보다 더 민감한 원칙, 책임과 관심사가 다른 오브젝트 또는 다른 모듈과의 낮은 결합도, 즉 느슨하게 연결된 형태를 유지하는 것이 바람직하다. 즉 느슨하게 연결된 형태를 유지하는 것이 바람직하다. 느슨한 연결은 관계를 유지하는 데 꼭 필요한 최소한의 방법만 간접적인 형태로 제공하고, 나머지는 서로 독립적이고 알 필요도 없게 만들어주는 것이다. 결합도가 낮아지면 변화에 대응하는 속도가 높아지고 구성이 깔끔해진다. 확장하기에도 매우 편히라다.

 

여기서 결합도란 '하나의 오브젝트가 변경이 일어날 때에 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도'라고 설명할 수 있다. 낮은 결합도란 결국 하나의 변경이 발생할 때 마치 파문이 이는 것처럼 여타 모듈과 객체로 변경에 대한 요구가 전파되지 않는 상태를 말한다. 결합도가 높아지면 변경이 따르는 작업량도 많아지고, 변경으로 인해 버그가 발생할 가능성이 높아진다. 

 

전략 패턴(Strategy Pattern) - 디자인 패턴의 꽃이라고 불릴 만큼 다양하게 자주 사용되는 패턴이다. 개방 패쇄 원칙의 실현에도 가장 잘 들어맞는 패턴이다. 전략 패턴은 자신의 기능 맥락(context)에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴이다. 여기서 말하는 알고리즘은 독립적인 책임으로 분리가 가능한 기능을 뜻한다. 이를 대체 가능한 전략이라고 보기 때문에 이름이 전략 패턴이다. 

 


 

word

Ajax - 비동기적인 애플리케이션의 제작을 위해 아래와 같은 조합을 이용하는 개발 기법이다. 표현 정보를 위한 HTML CSS 동적인 화면 출력 표시 정보와의 상호작용을 위한 DOM, 자바스크립트