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)가 가능하다.

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



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