본문 바로가기

Spring

(52)
AOP AOP AOP의 등장 배경과 스프링이 도입한 배경을 알아야한다. 스프링에서 가장 인기 있는 AOP 적용 대상은 바로 선언적 트랜잭션 기능이다. 서비스 추상화를 통해 해결했던 트랜잭션 경계설정 기능을 AOP를 이용해 변경 할 수 있다. 트랜잭션 코드의 분리 UserService에 트랜잭션을 추가했었는데, 트랜잭션 코드가 추가된건 아쉬운 느낌이다. 하지만 논리적으로 비즈니스 로직 전후에 있긴 해야된다. 이 로직들을 클래스로 분리를 시킬 수 있다. 트랜잭션 담당 클래스와 비즈니스 로직 클래스 둘로 나뉘어서 사용하는 곳에서 트랜잭션 클래스를 호출 후 트랜잭션 클래스에서 비즈니스 로직을 호출해서 공존시킬 수 있다. public class UserServiceTx { private UserService userSe..
서비스 추상화 서비스 추상화 사용자 레벨 관리 기능 추가 스프링이 어떻게 성격이 비슷한 여러 종류의 기술을 추상화하고 일관된 방법으로 사용할 수 있도록 지원하는지 확인해보자 사용자 레벨 관리 기능 추가 지금까지 짯던 코드들은 DAO 를 이용한 간단한 CRUD 였는데, 지금부터는 비즈니스 로직을 조금 추가 해보자 사용자의 활동내역을 참고해 레벨을 조정해주는 기능이다. 스케줄링으로 정해진 시간에 사용자가 정해진 조건을 만족시켰는지 확인 후 레벨을 변경시킨다. 필드 추가 public class User { private static final int BASIC = 1; private static final int SILVER = 2; private static final int GOLD = 3; private int lev..
예외 예외 예외를 처리하는 베스트 프랙티스들을 봐보자 초난감 예외처리 대표적인 예외처리 초난감 주자들 예외 블랙홀 try { } catch(SQLException e){ } 예외를 받고 아무것도 하지 않은 상황. 발생한 예외를 무시해버리는 상황이 발생한다. 오류가 나도 어디서 문제가 생기는지 전혀 알 수 없게 되버린다. } catch(SQLException e){ System.out.println(e); 또는 e.printStackTrace(); } 이것도 문제가 많다. 콘솔에만 나오기 때문에 콘솔을 보고있지 않으면 메시지를 볼 수 없다. 무의미하고 무책임한 throws public void method1() throws Exception { method2(); } 남용하면 throws 에 의미가 없어진다. ..
템플릿 템플릿 1장에서 관심이 다른 코드를 분리하고 (단일 책임), 확장과 변경에 대응할 수 있게 개선을 했었다. 객체지향 설꼐의 개방폐쇄 원칙을 따른것 이 원칙으로 코드에는 확장하려는 성질과 어떤 부분은 고정되어 변하지 않으려는 성질이 있는걸 알 수 있다. 템플릿은 변경이 거의 일어나지 않고 일정한 패턴으로 유지되는 부분을 자유롭게 변경되는 부분으로부터 독립시켜서 효과적으로 활용 할 수 있게 한다. 3장에서는 템플릿을 이용해 완성도 있는 DAO 만드는법과 스프링에 적용된 템플릿 기법을 봐보자 다시보는 초난감 DAO UserDao 에서 여러가지 개선작업을 했지만 예외상황에 대한 처리를 안했었다. DB 커넥션은 반드시 자원을 반납해야하기 때문에 예외처리를 꼭 해줘야 한다. public void deleteAll(..
테스트 테스트 스프링이 개발자에게 제공하는 것 중 가장 중요한 가치가 무엇이냐 하면 객체지향과 테스트다. 앱은 변화가 계속되는데, 이런 변화에 대응하는 첫 전략이 확장과 변화를 고려한 객체지향 설계와 이걸 효과적으로 쓰게 해주는 IOC/DI 기술이고, 두번째 전략은 코드를 확실하게 해주는 테스트 기술이다. UserDaoTest 다시 보기 테스트의 유용성 테스트 코드를 통해 코드가 제대로 작동하는지 확인 할 수 있다. 코드의 결함을 제거해 나가고 디버깅을 거쳐 결함이 제거 된걸 확인 할 수 있다. UserDaoTest특징 다시 1장에서 작성한 UserDao 테스트의 장점을 간단하게 봐보자. public class UserDaoTest { public static void main(String[] args) thr..
오브젝트와 의존관계 오브젝트와 의존관계 스프링은 자바를 기반으로한 기술이고 스프링이 자바에서 가장 중요하게 여기는건 객체지향이 가능한 프로그래밍 언어라는 점이여서 오브젝트에 가장 많은 관심을 가지고 있다. 따라서 스프링을 이해하기 위해서는 오브젝트에 대해 알고있어야 한다. (오브젝트의 관심은 오브젝트 설계의 관심까지 발전하게 되는데 객체지향 설계의 기초와 원칙을 비롯해서 디자인패턴, 단위테스트 같은 오브젝트 설계와 구현에 관심을 갖게 된다.) 스프링은 오브젝트를 어떻게 효과적으로 설계, 사용할지 기준을 제공해줘서 객체지향 기술과 설계 구현에 관한 실용적인 전략과 검증된 베스트프랙티스를 손쉽게 제공해주는 프레임워크다. 1장에서는 오브젝트의 설계와 구현, 동작원리에 더 집중을 해서 알아보자 초난감 DAO @Getter @Set..
[spring data jpa] spring data - jpa2 Projection 엔티티의 일부 데이터만 가져올때 사용된다. 지금까진 모든 컬럼을 가져왔다. 인터페이스 기반과 클래스 기반이 있다. 인터페이스 기반 Closed 프로젝션과 Open 프로젝션으로 나눌 수 있다. Closed 프로젝션은 밑 예제처럼 한정적인 것만 가져온다. Comment 객체에서 가져올 것들만 interface 로 만든다 리턴 타입을 바꿔준다. Sql 도 최적화가 된다 . 필요한 컬럼들만 select 를 함 Open 프로젝션은 사실상 다 가져온담에 조합을해서 내가 보고싶은것만 보는것. 연산도 가능함. 하지만 쿼리 최적화 안됨 @Value 로 설정을 한다. 이렇게 쓰면 쿼리도 최적화하고 커스텀하게 연산도 가능해진다. 클래스 기반도 똑같다. 하지만 코드만 더 많아짐 Specifications ..
[spring data jpa] spring data - jpa Common 을 기반으로 만든 jpaRepository 를 봐보자 boot 를 사용하지 않으면 어노테이션을 붙여야 사용가능하다 여기서 BaseRepository 들을 설정 할 수 있다. @Repository 를 안붙여도 된다 이미 중복 JpaRepository 구현체인 SimpleJpaRepository 에 이미 @Repository 가 들어가있다. 근데 붙어있어야 좋은 이유는 빈으로 등록도 되고 예외를 DataAccessException 으로 바꿔주기 때문 Jpa : 엔티티 저장하기 Transient 상태의 객체면 EntityManager.persist() Detached 상태면 EntityManager.merge() 가 된다. Detached 인지 어떻게 판단하는지? 엔티티의 @Id 프로퍼티를 찾아서..