Chapter 1: Understanding SQL and Relational Databases

참조 : The Programmer’s Guide to SQL (중고로 2달러 짜리도 있네요.)
  • SQL을 DDL, DML, DCL로 나눠볼 수 있다.
  • SQL의 역사 : SQL-89 => SQL-92 => SQL-99
  • 비교 연산의 결과는 세 가지. True, False, Unknown.
  • NULL 인지 확인할 때 = NULL 이 아니라 is NULL 로 물어봐야 해.
    • = 는 비교 연산자인데, NULL 과 다른 값들을 비교하면 결과는 UNKNOWN.
  • 1대다 관계 맺기
    • ‘다’쪽에 외례키 컬럼(상대방의 주키를 가지고 있는 컬럼)추가.
      • 그래서 ‘다’쪽의 테이블을 referencing table이라고 함.
      • 그래서 ‘1’쪽의 테이블을 referenced table이라고 함.
    • 무결성 제약 사항 생김.
  • 다대다에서 연관 테이블은 영어로 junction table, linking table, associate table, bridge table
  • 오라클에 접속하기
    • Connect username/password
  • 접속 끝내기
    • Disconnet
  • 10g는 Database가 한 개이기 때문에, Create Database XXX; 사용 못함.

사용자 삽입 이미지ORA-01501: CREATE DATABASE 문 오류입니다
ORA-01100: 데이터베이스가 이미 마운트되었습니다
만들려고 하면, 이런 메시지를 만나게 됩니다.

  • 오라클에서 한 번에 여러 Statement 실행하기.
    • BEGIN END;/ 사용.

사용자 삽입 이미지

Spring 애노테이션 기반 통합 테스트 작성하기

http://static.springframework.org/spring/docs/2.5.x/reference/testing.html#testcontext-tx

스프링이 제공하는 통합 테스트 용 클래스들은 매우 유용합니다. 특히 DAO를 테스트 할 때 자동 롤백은 정말이지 고마움까지 느껴질 정도로 애착이 갑니다. 그러나 한 가지 단점이 있다면, 이름이 너무 길다는 것이 단점입니다.

AbstractTransactionalDataSourceSpringContextTests

거의 40자 입니다. 이것을 외워서 타이핑 하다가는 오타나기 딱 좋습니다. 다행히 Eclipse의 자동완성 기능을 사용하면 AbstractT 까지만 입력하면 해당 클래스를 입력할 수 있습니다.

이 클래스는 내부적으로 DataSource를 필요로 하고, 이 클래스의 상위 클래스인 AbstractTransactionalSpringContextTests 이녀석은 PlatformTransactionManager를 필요로 합니다. 이 두 개를 가지고 테스트 케이스를 트랜잭션 처리해 주는 일을 합니다.
사용자 삽입 이미지스프링에서 트랜잭션 처리를 선언적으로 하는 방법이 두 가지 있는데, 하나는 XML이고, 하나는 애노테이션을 사용하는 방법입니다. XML은 역시 다 잊어버려서 레퍼런스를 찾아봐야합니다. 애노테이션은 그나마 기억하기가 매우 쉽습니다. @Transactional 이라는 것만 붙여주면 되죠.

이야기가 더 새기전에 마무리 해야겠습니다.

결론만 말씀드리면, Spring 2.5부터는 AbstractTransactionalDataSourceSpringContextTests를 쓰는 대신에 @Transactional과 @TransactionConfiguration을 사용해서 같은 기능을 하는 테스트 클래스를 작성할 수 있습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@TransactionConfiguration(transactionManager = “transactionManager”, defaultRollback = true)
@Transactional
public class DaoTest {

    @BeforeTransaction
    public void beforeTransation() {
        System.out.println(“before transation”);
    }

    @Before
    public void before() {
        System.out.println(“before”);
    }

    @After
    public void after() {
        System.out.println(“after”);
    }

    @AfterTransaction
    public void afterTransaction() {
        System.out.println(“after transaction”);
    }

    @Test
    public void transactionalTest() throws Exception {
        System.out.println(“This is a transactional test”);
    }

    @Test
    @NotTransactional
    public void testname() throws Exception {
        System.out.println(“This is not a transactional test”);
    }

}

애노테이션의 이름을 보고 어떤 결과가 출력될지 예상해 보세요. 정답은 접어 둡니다.

[#M_ more.. | less.. |before transation
before
This is a transactional test
after
after transaction
before
This is not a transactional test
after
_M#]
이밖에도, @Rollback 애노테이션으로 특정 테스트 케이스를 롤백할지 말지 설정할 수도 있습니다.