어플리케이션 아키텍처 아키텍처 어떤 경계 안에 있는 내부 구성요소들이 어떤 책임을 갖고 있고, 어떤 방식으로 서로 관계를 맺고 동작하는지를 규정하는 것 계층형 아키텍처 관심, 책임, 성격, 변하는 이유와 방식이 서로 다른 것들을 분리하고 분리된 각 요소의 응집도는 높이고 서로의 결합도는 낮춰주는 방식 책임과 성격이 다른 것을 크게 그룹으로 만들어 분리해두는 것 3계층 데이터 엑세스 계층 (DAO) DB, ERP, 레거시 시스템, 메인 프레임 등에 접근하는 역할 사용 기술에 따라서 혹은 추상화 수준에 따라서 수직 구분 (785p) 추상화 계층은 필요하다면 얼마든지 추가 가능 서비스 계층 비즈니스 로직을 담고 있음 잘 만들어진 스프링 어플리케이션의 서비스 계층 클래스는 이상적인 POJO 로 작성됨 DAO 계..
스프링의 정의 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 어플리케이션 프레임워크 어플리케이션 프레임워크 특정 계층이나 기술, 업무 분야에 국한되지 않고 (e.g. 웹 계층을 MVC 구조로 손쉽게 만들 수 있게 한다거나 관계형 DB 와 자바오브젝트를 매핑해주는 ORM 기술을 제공) 어플리케이션의 전 영역을 포괄하는 범용적인 프레임워크 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 어플리케이션 전 계층과 전 영역에 전략과 기능을 제공 경량급 EJB와 같은 과도한 엔지니어링이 적용된 기술과 스프링을 대비시켜 설명하려고 사용하는 표현 스프링은 가장 단순한 서버환경인 tomcat에서도 완벽하게 동작하며 단순한 개발툴과 기본적인 개발환경으로도 엔터프라이즈 개발에서 필요로 하는 주요한..
스프링 3.1의 DI 어노테이션의 메타정보 활용 장점 다양한 메타 정보를 얻을 수 있음 XML 보다 작성 편리 (IDE 도움) 단점 XML 과 달리 변경 사항이 있을 때마다 새로 컴파일해줘야 함 스프링 3.1 이후 DI 3요소 핵심 로직을 담은 자바 코드 DI 프레임워크 DI를 위한 메타데이터로서의 자바 코드 (어노테이션) 자바 코드를 이용한 빈 설정 어노테이션과 자바코드로 XML 대체 config 파일 @Configuration @ImportResource("/test-applicationContext.xml") public class TestApplicationContext { } 기존 xml 파일과 호환을 위해 @ImportResource() 를 붙임 의 전환 @Bean @Configuration ..
SQL - DAO 분리 SQL 변경 작업은 생각보다 빈번히 일어남 그때마다 DAO 코드를 수정하고 이를 다시 컴파일해서 적용하는 것은 번거로울 뿐만 아니라 위험하기도 함 따라서 SQL 을 적절히 분리해서 DAO 코드와 다른 파일이나 위치에 두고 관리하는 것이 좋음 Configuration 을 이용한 분리 public class UserDaoJdbc implements UserDao { private String sqlAdd; public UserDaoJdbc(DataSource dataSource, String sqlAdd) { jdbcTemplate = new JdbcTemplate(dataSource); this.sqlAdd = sqlAdd; } public void add(final User use..
개선 목표 타깃 오브젝트마다 거의 비슷한 내용의 ProxyFactoryBean 빈 설정정보를 추가해주는 부분 제거 빈 후처리기를 이용한 자동 프록시 생성기 빈 후처리기 스프링 빈 오브젝트로 만들어지고 난 후에, 빈 오브젝트를 다시 가공할 수 있게 해줌 스프링은 빈 후처리기가 빈으로 등록되어 있으면 빈 오브젝트가 생성될 때마다 빈후처리기에 보내서 후처리 작업을 요청 빈 후처리기를 이용한 자동 프록시 생성 방법 스프링은 빈 오브젝트를 만들 때마다 후처리기에게 빈을 보낸다. DefaultAdvisorAutoProxyCreator 는 빈으로 등록된 모든 어드바이저내의 포인트컷을 이용해 전달받은 빈이 프록시 적용 대상인지 확인 프록시 적용 대상이면 내장된 프록시 생성기에게 현재 빈에 대한 프록시를 만들게 하고, ..
이전 코드 개선 이전 코드 public void upgradeLevels() throws Exception{ // 트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { List users = userDao.getAll(); for (User user : users) { if (canUpgradeLevel(user)) { upgradeLevel(user); } } //정상적으로 작업을 마치면 트랜잭션 커밋 transactionManager.commit(status); } catch (Exception e) { //예외 발생시 롤백 transactionManage..
public class UserService { UserDao userDao; public UserService(UserDao userDao) { this.userDao = userDao; } public void upgradeLevels() { List users = userDao.getAll(); for (User user : users) { Boolean changed = null; if (user.getLevel() == Level.BASIC && user.getLogin() >= 50) { user.setLevel(Level.SILVER); changed = true; } else if (user.getLevel() == Level.SILVER && user.getRecommend() >= 30..
잘못된 예외처리 예외 블랙홀 예외를 잡고 아무 것도 하지 않는 경우 try{ //... } catch(SQLException e){ } 예외를 잡아서 출력만 하는 경우 무의미하고 무책임한 throws 메소드 선언부에 기계적으로 throws Exception 을 붙이는 경우 예외 종류와 특징 Error 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용 e.g. OutOfMemoryError, ThreadDeath 어플리케이션 코드에서 잡아도 대응 방법이 없기 때문에 잡을 필요 없음 Checked Exception Exception 의 subclass 중 RuntimeException 을 상속하지 않은 클래스 이 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 함..
UserDao 리소스 반환 시 예외처리 public void deleteAll() throws SQLException { Connection c = null; PreparedStatement ps = null; try { c = dataSource.getConnection(); //변하는 부분 ps = c.prepareStatement("delete from users"); ps.executeUpdate(); } catch (SQLException e) { throw e; } finally { if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (c != null) { try { c.close(); } catch (SQLExcept..
작은 단위의 테스트가 필요한 이유 한꺼번에 너무 많은 것을 몰아서 테스트하면 테스트 수행 과정도 복잡해지고, 오류가 발생했을 때 정확한 원인을 찾기가 힘들어진다. (e.g. 웹화면을 이용한 테스트) 따라서 테스트는 가능하면 작은 단위로 쪼개서 집중해서 할 수 있어야 한다. 개발자가 설계하고 만든 코드가 원래 의도한 대로 동작하는지를 개발자 스스로 빨리 확인받기 위함. 다른 사람에 의해 테스트될 때보다 빠르게 오류 수정 가능. UserDaoTest 특징 자동 수행 테스트 코드 테스트할 데이터가 코드를 통해 제공되고, 테스트 작업도 코드를 통해 자동으로 실행됨. 개발자는 main 메소드를 실행하기만 하면 됨 점진적인 개발을 위한 테스트 기능 추가, 코드 개선할 때 이전 기능이 영향받지 않는지 확인 가능 Us..
- Total
- Today
- Yesterday
- AOP
- 백기선
- 코테
- 프록시패턴
- 메서드레퍼런스
- gracefulshutdown
- 자바스터디
- 카카오
- 객체지향
- 코딩테스트
- 김영한
- 데코레이터패턴
- 자바
- 디자인패턴
- 서비스추상화
- 프록시
- c++
- 스프링
- 템플릿콜백
- java
- 토비
- 프로그래머스
- BOJ
- 예외처리
- OOP
- SOLID
- provider
- 토비의봄TV
- 토비의스프링
- ec2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |