2019년 3월 10일 일요일

[인프런] 스프링 프레임 워크 핵심 기술 수강 후기

스프링 프레임 워크 핵심 기술 수강 후기

사수님의 지식 공유로 백기선님에 대해 알게되었다. 처음에는 유튜브에 있는 영상만 보다가 인프런에서 직접 강의를 올리시는 것을 알게 되었고, 그 중 나에게 도움이 되면서 비교적 저렴한 강의를 찾다 '스프링 프레임워크 핵심 기술' 이라는 강의를 구매하였다.
이 강의에서는 스프링의 핵심기술을 이해하여, 스프링이 제공하는 다른 기능(JDBC, 테스트, MVC, 스프링부트 등)을 더 쉽고 정확하게 이해할 수 있게할 수 있는 베이스지식을 제공한다.
스프링하면 떠오르는 IoCAOP 에 대한 내용이 강의의 대부분을 차지하며, 이것이 무엇 이며 어떻게 제공되는지 설명하고 있다.
코드를 따라하면서 진행하는 강의는 아니었지만, 테스트 예제코드를 통해 설명을 해주셔서 이해하기 더 편했고, 재미있었다. 내 머리속에 애매하게 있던 지식들이 조금씩 정리가 되는 느낌이여서 매우 좋았다.
하지만, 엄청 깊게 설명하는 방향보다는 소개와 이해 중심의 강의여서 직접 써보면서 찾아봐야 확실하게 이해가 될 것 같은 느낌이었다. 모든 강의가 그렇겠지만 보는 것으로 끝나면 남는게 없다.
직접 해보고 내 머리속에 저장하자!
완강 후에는 바로 백기선님의 스프링 웹 MVC 강의도 구매하였다.
처음에는 '구글에 자료도 많고 잘 정리된 블로그도 많은데 왜 돈 주고 강의를 사야하지' 라는 생각이 있었는데, 생각을 조금만 해보면 고작 책 몇권 가격으로 내 소중한 시간을 아끼면서 좋은 지식을 습득할 수 있다면 구매할 가치가 충분하다. 매우
이것이 시간을 돈으로 살 수 있는 것이 아닐까?? 물론 내 것으로 만든다는 가정하에...




인프런 - 스프링 프레임워크 핵심기술
https://www.inflearn.com/course/spring-framework_core/

2019년 2월 24일 일요일

AWS 탄력적IP 간단 사용

AWS 탄력적 IP 사용하기

  • 저번 젠킨스 설정을 해보면서 인스턴스가 자꾸 뻗은 적이 있었다. 그럴 때 마다, 재기동을 해주었는데, ip가 변경되는 바람에 소스에 설정해놓은 DB주소들을 같이 변경해주었고, 터미널로 접속할 때도 IP와 키파일 경로를 복붙해서 쓰고 있었는데, 그 부분도 변경을 같이 해주는 바람에 매우 귀찮았었다.
하지만, AWS는 탄력적IP 라는 기능을 통해 고정IP를 제공해주고 있다고한다.
  • 설정방법
    • EC2 대시보드 > 네트워크 및 보안 > 탄력적 IP 
    • 새 주소 할당
    • 원하는 인스턴스 선택, 프라이빗IP에는 해당 탄력적주소IP를 입력
    • 인스턴스 메뉴 > 선택한 인스턴스 클릭 > 인스턴스 설명을 보면 방금 설정한 탄력적IP가 나와있는 것을 확인할 수 있음.
참고사항 - 탄력적IP를 할당받고 인스턴스에 연결을 안하면 요금이 발생되는 것 같다. 좀 이상한듯....왜 안쓰냐 이건가ㅋㅋ 탄력적IP 메뉴에서 안쓰는 IP는 주소릴리즈 하면 되는 것 같다.[해당내용 링크] https://aws.amazon.com/ko/premiumsupport/knowledge-center/elastic-ip-charges/

탄력적 IP를 사용한 인스턴스 쉽게 접속하기

  • AWS에서 알려준 예시 연결방법말고 직접 등록하여 쉽게 접속해보자
(연결방법 예시) ssh -i "cot.pem" ubuntu@ec2-{퍼블릭 IP}.ap-northeast-2.compute.amazonaws.com
  • 설정 방법
    • 인스턴스 생성 시 받은 키 파일을 해당 경로로 복사한다.
  cp {key.pem} ~./ssh/
  • ./ssh 경로에 config 파일을 생성한다.
  vi config

  다음의 내용 입력 후 저장 종료 (wq)
  ---

  Host {접속할 이름}
      HostName {AWS 탄력적IP}
      User ec2-user
      IdentityFile ~/.ssh/{key.pem}
  • 접속 확인
  ssh {접속할 이름}

2019년 1월 28일 월요일

실용주의 프로그래머 책 메모

실용주의 프로그래머 

드디어 실용주의 프로그래머를 다 읽었다.
영어공부에 대해 이야기하다가 사수에게 한글로 책을 읽고 원서로 한번 더 읽는 방법을 추천받아 이 책까지 빌리게 되었는데 1챕터 읽고 멈췄었다...
하지만, 2019년 읽을 도서 목록으로
실용주의 프로그래머 -> 이펙티브 자바 -> 클린코드 -> ...more
으로 정하여서 2019년 1월 - 약 1달에 걸쳐서 다 읽게 되었다.
사실..1월말 까지 책을 돌려줘야해서 살짝 급하게 읽었다. 중간에 대충 읽은 부분도 많다.
이 책은 어디선가 보고 들은 개발자가 가져야할 생각이나 명심해야할 것들을 모아놓은 책 느낌이었다. 그래서 더 읽는데 속도가 붙을 수 있었던 것 같았다. 책을 사서 다시 읽어봐도 좋을 듯 하다.
그땐 또 다른 느낌점들과 깨닫는 것들이 생길 것 같다.

인상깊은 문장 메모
  • 자신의 일에 대해 생각하면서 일해라!
  • 깨진 창문(나쁜설계, 잘못된 결정, 혹은 형편없는 코드)을 고치지 않은 채로 내버려 두지 마라.
  • 큰 그림에 늘 주의를 기울여라. 개인적을 무엇을 하고 있는가에만 정신을 쏟지 말고, 주변에서 무슨일이 벌어지는지 지속적으로 살펴보라.
  • DRY - Don't Repeat Yourself
  • 관련 없는 것들 간에 서로 영향이 없도록 하라. (직교성 강조하고 있음)
  • 최종 결정이란 없다. (유연성강조)
  • 언제나 소스코드 관리 시스템을 사용하라.
  • 가장 속이기 쉬운 사람은 자기 자신이다.
  • 가정하지 마라. 증명하라.
  • 단정문을 사용해서 불가능한 상황을 예방하라.
  • 시작한 것은 끝내라.
  • 모듈간의 결합도를 최소화하라.
  • 통합하지 말고 설정하라.
  • 코드에는 추상화를, 메타데이터에는 세부 내용을.
  • <의도적으로 프로그래밍하기>
    • 정말로 제대로 돌아가는 것이 아닐지도 모른다. 우리에게만 그런 것처럼 보일 수도 있다.
    • 신뢰할 수 있는 것에만 기대라. 우연한 일이나 가정에 의존하지 말라.
    • 기존 코드가 아픙로 짤 코드를 지배하도록 놓아두지 말라. 더 이상 적절한 코드가 아니라고 생각되면, 어떤 코드라도 교체할 수 있다.
    • 어떤 것이 잘돌아가는 것처럼 보이기는 하는데 그 이유를 모를 경우, 그것이 우연은 아닌지 반드시 확인하라.
  • 일찍 리팩터링하고, 자주 리팩터링 하라.
    • 리팩터링과 새로운 기능 추가를 동시에 하지마라.
    • 리팩터링 전 테스트 집합이 있는지 먼저 확인하라.
    • 단계를 작게 나누어서 신중하게 작업하라. 단계가 끝날 때마다 테스트를 돌려라.
  • 테스트 코드를 쉽게 접근할 수 있게 해놓는 것은 앞으로 코드를 사용할지 모르는 개발자들에게 매우 귀중한 자원 2가지를 제공하는 것이다.
    • 모듈의 모든 기능을 어떻게 이용하야 하는지 보여주는 예제
    • 후일 코드 변경 시 검증하기 위한 희귀 테스트를 구축할 수 있는 수단
  • 주석에 나오지 말아야 할 것들의 목록
    • 파일 내의 코드가 export하는 함수들의 목록
    • 리비전 기록
    • 이 파일이 사용하는 파일 목록

2019년 1월 13일 일요일

스프링에서 선언식 트랜잭션 간단하게 실습해보기

트랜잭션이란??

정보처리기사에 정말 많이 나오는 개념으로 all or nothing 이라고 생각하면 된다.
'모두 처리 아니면 모두 X'
예를 들면, 트랜잭션이 적용된 어떠한 행동이 3가지의 insert , update, insert의 쿼리를 수행하는 행동일 때,
insert 성공
update 성공
insert 실패
가 되었을 때 앞의 insert와 update 쿼리가 성공이 되었을 지라도 마지막 insert가 실패되었기 때문에 모두 롤백이 되어야하는 개념이다.
스프링에서 트랜잭션은 선언식 트랜잭션과 프로그램에 의한 트랜잭션을 통해 사용할 수 있는 것 같다.
선언식 트랜잭션 중 어노테이션방법을 게시판의 예제로 간단하게 살펴보자
사용자가 게시물을 클릭한다고 생각하면 다음의 순서로 진행된다. 
1. 조회수가 오른다. (update)
2. 게시물의 데이터를 가져온다. (select)
만약 이때 2. select 과정에서 오류가 발생한다고 가정한다면, 게시물의 데이터를 못가져왔으므로 조회가 되지않는다. 그렇다면 조회수도 오르지 말아야한다.
(예시가 좀 이상하다. 적절한 예시를 찾아서 수정해야할듯...)
이 행동에 대해서 트랜잭션을 적용해보겠다.

root-context.xml
...

    <!-- transactionManager -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

...
servlet-context.xml
...

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

...
serviceImpl
package com.wpp.service;
...
import org.springframework.transaction.annotation.Transactional;
...

@Service
public class BoardServiceImpl implements BoardService{
...


@Transactional
public Object read(int bnum) throws Exception {
    Object object = null;

    //조회수 올리기
    boardDao.uphit(bnum);

    //게시물 내용
    object = boardDao.read(bnum);

    //트랜잭션 테스트를 위한 Exception 발생
    if( object == null) {
        throw new RuntimeException();
    }

    return object;
}


...
}
아까 만든 가정대로 테스트를 하기위해
다음과 같이 object가 null이면 RuntimeException 을 발생시켜보았다.
breakpoint를 잡고 object = freeboardDao.read(bnum); 부분에 bum의 값을 DB에 없는 값을 줘서 object를 null이 나오도록 하였다.
@Transactional 어노테이션이 없을 때는 해당 Exception이 발생하더라도 그 전의 조회수가 올라가는 것을 볼 수 있지만, 어노테이션을 추가한 후에는 조회수 부분이 rollback 된 것을 볼 수 있다.

@Transactional 에는 다양한 속성을 지정해줄 수 있다.
ex_) @Transactional(isolation=Isolation.DEFAULT, timeout=10)
- 격리레벨 : 데이터에 대한 격리
  - ex_) 커밋된 데이터 읽기 허용, 커밋되지 않는 데이터 읽기 허용 등)
- 전파 : 트랜잭션 중 다른 트랜잭션 호출할 때의 경우
  - ex_) 기존에 실행되고 있는 트랜잭션이 있으면 참여 아니면 새로 생성, 무조건 트랜잭션 새로 생성
- readonly : 트랜잭션을 읽기전용으로 적용
  - ex_) 쓰기작업 발생 시 예외발생(기본설정은 false)
- rollbackFor : 특정 예외가 발생할 경우 롤백 처리 설정
  - ex_) : 스프링의 데이터엑세스 예외는 RuntimeException 이므로, 런타임예외만 롤백대상이므로 다른예외도 추가하는 방식...인가????
- timeout : timeout발생 시 롤백 처리(초단위같음)
  - ex_) : 지정된 시간안에 수행이 되지 않으면 롤백

어노테이션 외에도 aop를 이용해 service단의 모든 메소드에 트랜잭션을 적용시킬 수 있다.

게시판에 트랜잭션을 적용하려고 다시 소스를 보았는데.....
정말 개판이다..

물론 이 때는 게시판을 만들어보는 것에 목적으로 두고 생성하였지만,
참...ㅋㅋㅋ 이 구조는 왜 이런식이며...service단은 그냥 쿼리를 호출하는 거랑 뭐가 다르게 만들어졌으며..

너무 못짰다. 이게 뭐야ㅠㅠㅠㅠㅠㅠㅠㅠ
얘를 개선할 수 있을까?
todo
aop 예제도 해보자.

2019년 1월 2일 수요일

그림과 실습으로 git branch 연습하기

개발자 커뮤니티 페이지를 돌아다니다가 git이 어렵다면 branch가 어려운 일 겁니다. 라는 제목을 보았다.
이 글에서 git branch 관련해서 연습을 하는 사이트를 추천해주셨는데

아주 직관적이고 그림으로 움직이면서 설명을 해줘서 브랜치에 대해 이해하기 쉽게 만들어져있었다.
마침 매번 사용할 때마다 찾아보고, 이클립스 안에서만 간단하게 commit, push만 하는 나에게 유익하다고 생각되었다.
commit, branch, checkout, cherry-pick, reset, revert, rebase, merge
의 명령어를 사용할 수 있고, 다음과 같은 단계별로 진행된다.

각 단계마다 명령어횟수를 측정하는데 모범답안 횟수에 도달하거나 하지 못할 때 메시지를 보여준다.

하단부에서 답안을 확인할 수 있으며, 초기화(Reset)이나 되돌리기(Undo)가 가능하다.

단계별로 되어있어 복습하기 쉽고, 답안까지 친절하게 제공해주고 있어 학습하기 좋은 것 같다. 



나도 언젠가 누군가에게 쉽고 간단하게 설명해줄 수 있는 날이 올까....?

2018년 12월 23일 일요일

리눅스 명령어 간단 정리

기본적인 리눅스 명령어 (책)

cd : 디렉토리 변경(change directory)
  cd .. : 상위 디렉토리로 이동
  cd : 홈 디렉토리로 이동
  pwd : 현재 디렉토리 위치
ls(list segments) : 디렉토리 및 파일 정보 화면에 출력
  -l : 긴 리스트 형으로 화면에 출력
history : 사용자가 입력한 명령어들의 기록을 보여줌
alias : 사용자 정의 명령어
  ex) alias ex1 = "clear"  ex1 입력하면 clear 실행됨
      alias 입력 시 설정된 내용 조회 가능
      unalias ex1 로 해제가능
rm : 파일이나 디렉토리 삭제
  -r 디렉터리 삭제, 하위 내용을 먼저 삭제
  -f / --force / 강제로 파일이나 디렉토리를 삭제하고, 삭제할 대상이 없을 경우 메시지를 출력하지 않음
  -i  매번 삭제할 때마다 사용자에게 질문함
  -v 삭제하는 내용 보여줌
mv : 파일 및 디렉토리 이동, 이름 변경
  -b 백업 파일을 생성
  -f 사용자에 묻지 않고 파일 덮어씀
  -i 덮어쓸 경우 사용자에게 물어봄
  -n 파일이 존재하면 덮어쓰지 않음
  -S 지정한 접미사로 백업생성
  -t 전체 원본파일을 대상 디렉토리로 이동
  -u 파일이 업데이트된 경우에만 이동함
  -v 진행상태 정보를 출력
| (pipe) : 어떤 명령어의 실행 결과를 다른 명령어의 입력으로 전달하는 것
  ex) ls -l | grep "tom"
crontab : 시스템에서 주기적으로 실행하는 명령어 설정
  -l 현재 로그인된 계정에 잡혀있는 작업 스케쥴 확인
  -e 현재 로그인 중인 계정에 작업을 등록  
  (0 0 * * 0 /bin/myjob.sh ---> 매월 일요일 0시 0분에 /bin/myjob.sh 실행
  분 시 일 월 요일)
  -r 현재 crontab에 등록된 작업을 삭제
gzip : 파일압축
  -n 1~9, 1이 가장 빠르고 압축률은 가장 낮음
  -c 압축결과를 출력, 원본파일은 그대로 둠
  -d 압축해제
  -f 강제압축
  -l 압축파일의 정보 출력
  -r 디렉토리에 포함된 모든 파일을 압축
  -t 압축파일 테스트
  -v 압축 혹은 해제 시 정보출력
tar : 파일을 압출하거나 해제하는 명령어
  -z gzip으로 압축하거나 해제
  -x 압축을 해제함
  -h 심볼릭 링크는 묶지 않고 심볼릭 링크가 가리키는 파일을 묶음
  -c 새 저장파일을 만듦
  -f 파일이름 지정
  -m 파일의 변경 시간정보를 유지하지 않음
  -P 모든 퍼미션 정보를 유지
  -p 파일 이름의 맨 앞, 문자를 버리지 않음
  -s 저장 파일 목록과 똑같은 순서로 압축을 해제
  -v 처리 중인 파일을 자세하게 보여줌
  -Z Compress 압축하거나 해제
which : 리눅스에서 사용하는 명령어의 경로를 찾아서 화면에 출력 (whereis는 관련파일까지 제공)
mkdir : 디렉토리 생성
  -m 디렉토리 권한 설정 (기본 755 rxwr-xr-x)
  -p 상위 경로도 함께 지정
  -v 디렉토리 생성 후에 생성된 디렉토리에 대한 메시지를 출력함
cp : 파일 혹은 디렉토리를 복사
  -f 덮어쓰기를 해서 복사
  -r 하위 디렉토리 전부를 모두 복사
  ex) cp test1 test2  ---> test1파일을 test2파일로 복사
touch : 파일을 생성하거나 파일의 시간정보 변경
  ex) touch test1.txt ---> 파일이없으면 생성
  touch -t 1801220333 ---> 18년 1월 22일 3시 33분으러 시간정보 변경
  touch -r test1 test2 --> test1파일과 test2파일의 시간정보를 같게 변경
file : 파일의 종류확인
  -b 파일의 유형만 출력
  -f 파일목록에서 지정한 파일들에 대해서만 명령을 실행
  -i MIME 타입형태로 출력
  -m 매직 파일을 지정
  -L 심볼릭 링크된 파일을 추적
  -v 버전 정보 출력
  -z 압축된 파일 확인
cat : 파일의 내용을 확인할 수 있는 명령어
head : 파일을 읽어 첫줄부터 10번째 줄까지 화면에 출력
tail: 파일을 끝부터 읽어 10번째 줄까지 화면에 출력
grep : 특정파일 내에 있는 문자열을 검색하는 역할을하는 명령어
  -c 검색 문자열이 속한 행 수를 출력
  -H 파일명과 함께 출력
  -i 대소문자를 구분하지 않음
  -n 검색한 문자가 속하는 행번호와 함께 출력
  -r 현재경로에서 하위경로까지 검색
  -v 검색하는 문자가 없는 행을 출력
  -w 패턴 표현식을 하나의 단어로 검색

grep 정규식
. 한글자
* 길이와 관계없는 문자열
^ 행의 첫 시작
$ 행의 마지막 위치
[] 한 문자길이 패턴
[^] 입력된 문자들의 여집합
wc : 특정 파일의 바이트 수나 검색하고자 하는 단어 수 및 행수를 알고자 할때 사용
  -c 바이트 크기 출력
  -m 문자 수를 출력
  -l 행수를 출력
  -L 가장 긴 문자만을 출력
sort : 파일을 내용을 정렬하는 명령어
  -k 지정한 필드를 기준으로 정렬
  -r 내림차순 정렬
  -f 모든 문자를 소문자로 식별
  -u 필드 내에서 중복된 값을 제거하여 유일한 값만 출력
cut : 텍스트 파일에서 특정 부분을 지정하여 출력할 수가 있는 명령어
  -b 특정 자리만 출력함
  -d 인자 문자열을 기준으로 해서 출력
  -f d옵션과 함께 사용되어서 구분된 필드를 출력
split : 파일을 나누고 싶을 때 사용
  -b 바이트 단위로 파일을 나눔
  -l 지정한 라인 수 만큼 파일을 나눔
  ex) split -b 1500k 파일명
diff : 두 개의 파일간의 차이점을 알 수 있음
shutdown : 리눅스 정지
  -r 재부팅
  -h shutdown 후 시스템 종료
  -c 진행중인 shutdown을 취소
  -k 경고메시지를 출력하고 실제 shutdown은 수행하지 않음
  -f fsck를 실행하지 않고 재부팅
  -t sec 지정한 시간에 재기동
  -v 상세 정보를 출력
reboot : 리눅스 다시 시작
  -n 연산은 중지하고 다시시작
  -f 강제로 다시시작
  -p 연산을 중지 시에 전원을 종료
  -q 오류가 없으면 다시시작하지 않음
  -v 상세정보 출력
netstat : 시스템과 연결된 모든 네트워크 연결을 확인
  -a 모든 소켓 정보를 확인
  -n 도메인 주소를 읽지 않고 숫자로 출력
  -p PID와 사용 중인 프로그램명을 출력
  -g 멀티캐스트 그룹 정보
ping : 네트워크 상태를 정보를 점검하기 위한 명령어(ICMP프로토콜을 사용하여 ICMP echo Request를 전송하고 ICMP echo reply가 되돌아오는 지 확인)
ping 210.220.163.82
PING 210.220.163.82 (210.220.163.82): 56 data bytes
64 bytes from 210.220.163.82: icmp_seq=0 ttl=248 time=9.240 ms
64 bytes from 210.220.163.82: icmp_seq=1 ttl=248 time=9.830 ms
nslookup : 도메인명에 대한 IP주소를 확인하기 위해 DNS에 질의를 실행함
$ nslookup www.naver.com
Server:        210.220.163.82
Address:    210.220.163.82#53

Non-authoritative answer:
www.naver.com    canonical name = www.naver.com.nheos.com.
Name:    www.naver.com.nheos.com
Address: 125.209.222.142
Name:    www.naver.com.nheos.com
Address: 125.209.222.141

halt : 리눅스 종료
  -d wtmp에 로그를 기록하지 않음
  -f 강제로 종료
  -n 종료할 때 동기화를 하지 않음
  -w 실제로 종료하지 않고 /var/log/wtmp에 로그를 기록

객체지향의 사실과 오해 - 인터페이스 부분 정리

객체지향의 사실과 오해 - 인터페이스
  • 인터페이스는 객체가 다른 객체와 협력하기 위한 접점
  • 일반적으로 인터페이스는 다음과 같은 세 가지 특징을 지님
1. 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있음
2. 인터페이스 자체는 변경하지 않고 단순히 내부 구성이나 작동방식만을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다
3. 대상이 변경되더라도 동일한 인터페이스르 제공하기만 하면 아무런 문제없이 상호작용을 할 수 있다
  • 객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 '메시지 전송'
  • 책임은 객체가 메시지를 수신했을 때 수행해야 하는 객체의 행동이며, 실제로 객체의 공용 인터페이스를 구성하는 것은 객체가 외부로부터 수신할 수 있는 메시지의 목록
객체가 메시지를 수신했을 때 적절한 객체의 책임이 수행됨 -----> 메서드
  • 객체지향적인 사고방식을 이해하기 위해서는 세 가지 원칙이 중요
1. 좀 더 추상적인 인터페이스 : 지나치게 상세한 수준의 메시지를 보내는 것은 객체의 자율성을 저해함
2. 최소 인터페이스 : 외부에서 사용할 필요가 없는 인터페이스는 최대힌 노출하지 말라
(객체 내부를 수정하더라도 외부에 미치는 영향을 최소화할 수 있음)
3. 인터페이스와 구현간의 차이가 있다는 점을 인식
: 훌륭한 객체란 구현을 모른 채 인터페이스만 알면 쉽게 상호작용할 수 있는 객체
----> 객체 외부에 노출되는 인터페이스와 객체의 내부에 숨겨지는 구현을 분리해서 고려해야함
----> '인터페이스와 구현의 분리 원칙'
----> why? 객체의 모든 것이 외부에 공개돼 있다면 아무리 작은 부분을 수정하더라도 변경에 의한 파급효과가 객체 공동체의 구석구석까지 파고들 것임

'강조'
객체가 가져야 할 상태와 메서드 구현은 객체 내부에 속함. 이 부분을 수정하더라도 객체 외부에 영향을 미쳐서는 안됨
객체 외부에 영향을 미치는 변경은 객체의 공용 인터페이스를 수정할 때만
---> 캡슐화
  • 캡슐화: 객체의 자율성을 보존하기 위해 구현을 외부로부터 감추는 것
---> 객체의 상태와 행위를 캡슐화함으로써 협력적이고 자율적인 존재가 될 수 있음
  • 자율적인 객체? : 공용 인터페이스를 수정하지 않는 한 자신과 협력하는 외부 객체에 영향을 미치지 않고 내부의 구현을 '자유롭게' 수정할 수 있음
  • 결론: 객체가 자율적인 책임을 가지는 것이 중요하다
객체의 책임이 자율적일수록 협력이 이해하기 쉬워지고 유연하게 변경할 수 있게 된다

1. 자율적인 책임은 협력을 단순하게 만든다
---> 책임이 적절하게 추상화됨

2. 외부와 내부를 명확하게 분리
---> 요청하는 객체가 몰라도 되는 사적인 부분이 객체 내부로 캡슐화되면서 인터페이스와 구현이 분리됨

3. 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않음
---> 책임이 자율적일 수록 변경에 의해 수정되야하는 범위가 좁아지고 명확(결홥도가 낮아짐)

4. 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공
---> 설계가 유연해지고 재사용성이 높아짐

5. 객체의 역할을 이해햐기 쉬워짐
---> 객체의 응집도를 높은 상태로 유지가 쉬워짐