Group Study (2024-2025)/Spring 심화 10

[Spring 심화] 10주차 - 스프링 프로젝트 시작하기

개요프로젝트 개발 전, 우리는 시스템을 구성하는 주요 컴포넌트들(클라이언트와 서버, DB, 외부 서비스 등)을 어떻게 배치하고 통신할지, 어떤 기술을 사용할지에 대한 전체 IT 시스템이 어떻게 구성되고 연동되는지를 다룬다.이를 시스템 레벨 아키텍처라고 한다.ex) React로 구성된 프론트엔드 → Spring Boot 백엔드 → MySQL 데이터베이스 → Redis 캐시 → Elasticsearch 검색 엔진해당 아키텍처 구성이 끝났을 때, 다음으로 결정할 사항은 백엔드 애플리케이션의 내부 구조를 다루는 것이다. 토비의 스프링에서는 스프링 웹 애플리케이션의 아키텍처를 어떻게 설계할 수 있는지 알아볼 것이다. 애플리케이션 아키텍처의 종류우선 애플리케이션 아키텍처의 종류에는 세 가지로 나눈다.1.계층형   ..

[ Spring 심화 ] 9주차 - 스프링이란 무엇인가?

8. 스프링이란 무엇인가?8.1 스프링의 정의스프링에 대해 가장 잘 알려진 정의는 이렇다. "자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크"애플리케이션 프레임워크라이브러리/프레임워크는 특정 업무 분야나 한 가지 기술에 특화된 목표를 가지고 만들어 진다. 하지만 스프링은 특정 계층, 기술, 업무 분야에 국한되지 않고 애플리케이션 전 영역을 포괄하는 범용적ㅇ니 프레임워크다.역사스프링은 2003년에 출간된 로드 존슨의 Expert One-on-One J2EE Design and Development라는 책에서 탄생했다.이 책은 J2EE 애플리케이션 설계와 개발에 대한 책이었고 개발 전략과 기존 기술에 대한 대안을 샘플 애플리케이션 형태로 제공했다.이 책에서 강조한 전략이 "항상..

[ Spring 심화 ] 8주차 - AOP(3)

목차6.6 트랜잭션 속성6.7 애노테이션 트랜잭션 속성과 포인트컷6.8 트랜잭션 지원 테스트6.6 트랜잭션 속성트랜잭션을 가져올 때 파라미터로 트랜잭션 매니저에게 전달하는 DefaultTransactionDefinition의 용도가 무엇인지 알아보자.6.1.1 트랜잭션 정의트랜잭션의 동작방식에 영향을 줄 수 있는 네 가지 속성의 정의트랜잭션 전파: 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 경정하는 방식을 말한다.PROPAGATION_REQUIRED진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다.DefaultTransactionDefinition의 트랜잭션 전파 속성PROPAGATION_REQUIRES_NEW항상 ..

[ Spring 심화 ] 7주차 - AOP(2)

분리한 트랜잭션 코드 → 기존 설계와 코드에는 영향을 주지 않는 형태로 제공되어야 함5. 스프링 AOP1. 자동 프록시 생성프록시 팩토리 빈 방식의 접근 방법의 한계부가기능이 타깃 오브젝트마다 새로 만들어지는 문제 → ProxyFactoryBean어드바이스로 해결부가기능의 적용이 필요한 타깃 오브젝트마다 거의 비슷한 내용의 ProxyFactoryBean빈 설정정보 추가해주는 부분중복 문제의 접근 방법런타임 코드 자동생성 기법을 통한 해결(프록시)JDK의 다이내믹 프록시 → 특정 인터페이스를 구현한 오브젝트에 대해 프록시 역할을 해주는 클래스를 런타임시 내부적으로 만들어줌 → 클래스 소스는 남지 않지만 타깃 인터페이스의 모든 메소드를 구현하는 클래스가 만들어짐다이내믹 프록시의 역할 → 변하지 않는 타깃으로..

[ Spring 심화 ] 6주차 - AOP(1)

6장 AOP6.1 트랜잭션 코드의 분리AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3대 기반기술의 하나다.스프링에 적용된 가장 인기 있는 AOP의 적용 대상은 바로 선언적 트랜잭션 기능이다!서비스 추상화를 통해 많은 근본적인 문제를 해결했던 트랜잭션 경계설정 기능을 AOP를 이용해 바꿔보자.🍃 메소드 분리비즈니스 로직 코드를 사이에 두고 트랜잭션 시작과 종료를 담당하는 코드가 앞뒤에 위치함.=> 비즈니스 로직을 담당하는 코드를 메소드로 추출해서 독립시키자.🍃 DI를 이용한 클래스의 분리DI 적용을 이용한 트랜잭션 분리UserService를 구현한 또 다른 구현 클래스를 만들자.UserService를 구현한 UserServiceTx는 트랜잭션 경계설정이라는 책임을 맡고 있을 뿐이다.UserS..

[ Spring 심화 ] 5주차 - 서비스 추상화

5장 서비스 추상화5.1 사용자 레벨 관리 기능 추가5장에서는 dao 에 트랜잭션을 적용해보면서 스프링의 추상화 기술과 이를 지원하는 방법을 알아보자~dao에 비즈니스 로직을 추가로 구현해보자사용자의 레벨은 basic, silver, gold 세가지 중 하나사용자가 처음 가입하면 basic, 이후 활동에 따라 한단계씩 업그레이드50회 이상 로그인 시 basic -> silver 레벨이 됨silver 레벨이면서 30번 이상 추천받으면 gold 레벨이 됨사용자 레벨의 변경작업은 일정한 주기를 가지고 일괄적으로 진행변경 작업 전에는 조건을 충족하더라도 레벨의 변경 안일어남🍃 필드 추가Level enum숫자 타입을 사용하게 되면 만약 level의 값이 1,2,3 이 아닌 다른 값이 들어가더라도 버그가 생길 수..

[ Spring 심화 ] 4주차 - 예외처리

Chapter4. 예외처리의 학습목표JdbcTemplate 을 대표로 하는 스프링의 데이터 액세스 기능에 담겨있는 예외처리와 관련된 접근 방법을 알아본다.4.1 사라진 SQLExceptionJdbcTemplate 적용 전public void deleteAll() throws SQLException { this.jdbcContext.executeSql("delete from users");}JdbcTemplate 적용 후public void deleteAll() { this.jdbcTemplate.update("delete from users");}JdbcTemplate 을 사용한 코드에서는 throws SQLException 가 사라졌다. 어디로 간 것일까?4.1.1 초난감 예외처리모든 예외는..

[ Spring 심화 ] 3주차 - 템플릿

3장. 템플릿✨ 스프링에 적용된 템플릿 기법 살펴보기, 이를 적용해 완성도 있는 DAO 코드 만들기3.1 다시 보는 초난감 DAO🤔 UserDao 코드는 아직 예외상황에 대한 처리와 관련한 문제점이 남아있다!3.1.1 예외처리 기능을 갖춘 DAOJDBC 코드에는 반드시 지켜야할 원칙이 있음예외처리!예외가 발생시 사용한 리소스를 반환하지 못하면 시스템에 심각한 문제 발생 JDBC 수정 기능의 예외처리 코드deleteAll() 메소드public void deleteAll() throws SQLException { Connection c = dataSource.getConnection(); PreparedStatement ps = c.preparedStatement("delete from user..

[ Spring 심화 ] 2주차 - 테스트

1. 테스트UI 테스트의 문제점하나의 테스트를 수행하는 데 참여하는 클래스와 코드가 너무 많음→ 다른 계층의 코드/컴포넌트/서버 설정 등 많은 요소가 테스트에 영향Unit Test관심사의 분리테스트는 가능한 한 최소 단위로 쪼개서 집중해야 함단위한 관심에 집중해 효율적으로 테스트할 만한 범위작을수록 용이단위를 넘어서는 코드는 신경 X 참여 X확인의 대상과 조건이 간단하고 명확할수록 좋음외부 리소스 의존 금지리소스(DB, ..)의 상태를 테스트가 관장하면 가능의존 : 리소스의 상태가 매번 변화, 테스트를 위해 DB를 특정 상태로 만들 수 없는 상태선 단위테스트 → 후 플로우 테스트단위별로 검증해 오류 잡은 후 긴 테스트를 하면 디버깅이 용이할 것자동수행 테스트 코드테스트의 전 과정을 자동으로 진행 ⇒ 자주..

[ Spring 심화 ] 1주차 - 오브젝트와 의존관계

스프링이 가장 관심을 많이 두는 대상은 '오브젝트'다. 스프링은 오브젝트를 어떻게 효과적으로 설계하고, 구현하고, 사용하고, 개선해 나갈 것인가에 대한 기준을 마련해준다→ 스프링이 관심을 갖는 대상인 오브젝트의 설계와 구현, 동작원리에 집중해보자!1.1 초난감 DAO: 사용자를 생성(add), 조회(get)하는 메소드를 각각 다음과 같은 순서로 작성했다1. DB connection 획득2. SQL 담은 Statement 생성, 실행3. 결과를 받아 오브젝트에 옮기기4. 작업을 위해 생성된 리소스(Connection Statement, ResultSet) 닫기5. main()에 테스트코드 작성→ 다음과 같이 작성한 코드도 의도된 동작을 충실히 수행하며 & 테스트도 가능하다→ 하지만 이 코드를 개선해나가며 ..