TIL - 0716

SQL(using mysql)

테이블 구조 보기

  • DESC, DESCRIBE
    • 컬럼명, 데이터 타입, 기본값, PK 설정 등이 나옴
> DESC $TABLE_NAME
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| MEMBER_ID | int(11)      | NO   | PRI | NULL    |       |
| TEAM_ID   | int(11)      | YES  |     | NULL    |       |
| NAME      | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
  • CHAR와 VARCHAR 차이 : 할당한 값보다 최대 길이가 더 길 경우 공백으로 채우는 것과 할당한 값에 따라 크기를 줄여버리는 것

테이블 검색

  • AND가 OR보다 우선순위가 더 높은 연산자
    • ”( )”로 우선순위를 변경할 수 있음
> SELECT * FROM $TABLE_NAME (a = 1 OR a = 2) AND (b=1 OR b=2);
  • 패턴매칭 검색하기 : LIKE
    • column명 LIKE 패턴 : 해당 열의 데이터 중에서 패턴과 매칭되는 데이터들만 검색
    • % : 임의의 문자 , 문자열
    • _ : 임의의 문자 하나
    • 위의 두 와일드카드 문자를 사용하지않으면 완전 일치 검색을 함 : NAME = ‘java’ 와 똑같은 것
> SELECT * FROM MEMBER WHERE NAME LIKE '%java%';
> SELECT * FROM MEMBER WHERE NAME LIKE '%\%%';

Spring

트랜잭션 서비스 추상화를 통해서 알아보는 스프링의 서비스 추상화

  • 서비스 계층에서 트랜잭션 커넥션을 만들고 커밋과 롤백 코드를 만들어야함(경계 설정)
    • 순수 데이터 액세스 계층에서 트랜잭션 계층을 만들면 액세스할 때만 트랜잭션이 생성되고, 로직 처리에 대한 커밋/롤백 시점은 설정할 수 없음 : 서비스 계층에서 처리하는 이유
    • 서비스 계층에서 만든 커넥션을 가지고 순수 데이터 액세스 계층도 데이터베이스 액세스 해야함 : 같은 트랜잭션 내에서 처리, 아니면 별개 트랜잭션을 만들어서 처리하는 것
  • 스프링에서 제공하는 선언적 트랜잭션(@Transactional)을 적용하지않고 그냥 작성한 코드(컴파일 상관없이 흐름만 신경쓴 코드)과 코드의 문제점
    • UserDao(Repository, Data Access Layer)가 Connection 타입 파라미터를 받아서 사용함 -> Connection이 아닌 Connection을 어떤 방식으로든 래핑한 객체가 필요한 방법 등 다른 방법으로 커넥션을 전달 - 유지한다면? 코드변경이 있어야함
    • try ~ catch ~ finally 코드가 Service 코드에 그대로 드러남, 트랜잭션이 필요한 곳마다 각각 경계설정 코드를 만들어줘야함(중복)
public class UserService {

    private UserDao userDao;

    public void upgradeLevel() throws Exception {
        Connection conn = ...;
        
        try {       
            userDao.update(conn, user.upgradeLevel());
            conn.commit();
        } catch (Exception e) {
            conn.rollback();
            throw e;
        } finally {
            conn.close();
        }
    }
}
  • 앞서 제기된 문제에 대한 스프링의 해결 방법
    • Connection을 파라미터에서 없애기 : Connection을 생성하고 특정 장소에 저장해뒀다가 꺼내서(UserDao - 같은 트랜잭션 내에서 처리하기위해) 사용하는 방식(트랜잭션 동기화), 커밋, 롤백될 때까지 커넥션을 닫지않음
  • 문제점 고치는건 내일 다시하기~!
    • 스프링은 객체지향의 끝판왕이랄까…. 관심사 분리는 철저히, 구체적인 방법에 의존하지않게끔(변경에 유연하도록), 리플렉션 API로 중간 단계를 만들기도하고(자동화처럼)