Spring-Boot
-
스프링 DB 데이터접근 원리 - 4. 스프링과 문제해결 - 트랜잭션Spring-Boot/스프링 DB 1편 - 데이터 접근 핵심 원리 2022. 6. 22. 08:31
문제점들 애플리케이션 구조 * 프레젠테이션 계층 * ㆍUI와 관련된 처리 담당 ㆍ웹 요청과 응답 ㆍ사용자 요청을 검증 ㆍ주 사용 기술 : 서블릿과 HTTP 같은 웹 기술, 스프링 MVC * 서비스 계층 * ㆍ비즈니스 로직을 담당 ㆍ주 사용 기술 : 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 * 데이터 접근 계층 * ㆍ실제 데이터베이스에 접근하는 코드 ㆍ주 사용 기술 : JDBC, JPA, File, Redis, Mongo *순수한 서비스 계층* - 여기서 가장 중요한 곳은 핵심 비즈니스 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI(웹)와 관련된 부분이 변하고 데이터 저장 기술을 다른 기술로 변경해도, 비즈니스 로직은 최대한 변경없이 유지되어야 한다. - 이렇게 하려면 서비스 계층..
-
스프링 DB 데이터접근 원리 - 3. 트랜잭션 이해Spring-Boot/스프링 DB 1편 - 데이터 접근 핵심 원리 2022. 6. 19. 14:49
트랜잭션 - 개념 이해 - 데이터 베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다 - 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋( Commit ) 이라 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백 ( Rollback ) 이라 한다 트랜잭션 ACID - * 원자성 * : 트랜잭션 내에서 실행한 작업들을 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. - * 일관성 * : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. ㆍ예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야한다 - * 격리성 * : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. ㆍ예를 들어 동시에 같은 ..
-
스프링 DB 데이터접근 원리 - 2. 커넥션풀과 데이터소스 이해Spring-Boot/스프링 DB 1편 - 데이터 접근 핵심 원리 2022. 6. 18. 13:07
커넥션 풀 이해 * 데이터베이스 커넥션을 매번 획득 * - 데이터베이스 커넥션을 획득할 떄는 다음과 같은 복잡한 과정을 거친다. 1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다 2. DB드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에 3 way handshake 같은 TCP/IP 연결을 위한 네크워크 동작이 발생한다 3. DB드라이버는 TCP/IP 커넥션이 연결되면 ID,PW와 기타 부가정보를 DB에 전달한다 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB세션을 생성ㅎ나다 5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다 6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. - 이렇게 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도..
-
스프링 DB 데이터접근 원리 - 1. JDBC 이해Spring-Boot/스프링 DB 1편 - 데이터 접근 핵심 원리 2022. 6. 18. 09:38
H2 데이터베이스 설정 - H2 데이터베이스는 개발이나 테스트 용도로 사용하기 좋은 가볍고 편리한 DB이다. - 그리고 SQL을 실행할 수 있는 웹화면을 제공한다. - h2 데이터베이스 버전은 스프링 부트 버전에 맞춘다 - MAC, 리눅스 사용자 ㆍ권한 주기 : ' chmod 755 h2.sh ' ㆍ실행 : ' ./h2.sh ' - 원도우 사용자 ㆍ실행 : ' h2.bat ' - 데이터베이스 파일 생성 방법 ㆍJDBC URL ㆍ' jdbc:h2:~/test ' ( 최초 한번 ) ㆍ' ~/test.mv.db ' 파일 생성 확인 ㆍ이후부터는 ' jdbc:h2:tcp://localhost/~/test ' 접속 JDBC 이해 * 애플리케이션 서버와 DB - 일반적인 사용법 * 1. 커넥션 연결 : 주로 TCP/..
-
Spring 핵심 원리 고급편 - 13. 스프링 AOP - 실무 주의사항Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 10. 10:07
프록시와 내부 호출 - 문제 - 스프링은 프록시 방식의 AOP를 사용한다 - 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출한다 - 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출 - 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다 - AOP를 적용하면 스프링은 대상 객체 대신 프록시를 스프링을 등록 - 따라서 스프링은 의존관계 주입시에 항상 프록시 객체를 주입한다 - 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생 X - 하지만 대상 객체의 내부에서 메서드를 호출하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다 @Slf4j @C..
-
Spring 핵심 원리 고급편 - 11. 스프링 AOP - 포인트컷Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 9. 11:19
- AspectJ는 포인트컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다 ㆍ예 ) @Pointcut(" execution( * hello.app.order..*(..)) ") - 포인트컷 표현식은 AspectJ pointcut expression 즉 AspectJ가 제공하는 포인트컷 표현식을 줄여서 말하는 것이다 * 포인트컷 지시자 * - 포인트컷 표현식은 ' execution ' 같은 포인트컷 지시자( Pointcut Designator ) 로 시작한다. 줄여서 PCD라 한다. 포인트컷 지시자의 종류 - execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다 - within : 특정 타입 내의 조인 포인트를 매칭한다 - args : 인자가..
-
Spring 핵심 원리 고급편 - 10. 스프링 AOP 구현Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 9. 09:03
//테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' - 테스트에서 롬복 사용 시 Gradle 추가 * 참고 * - @Aspect 를 사용하려면 @EnableAspectJAutoProxy 를 스프링 설정에 추가해야 하지만, 스프링 부트를 사용하면 자동으로 추가된다. @Slf4j @Aspect public class AspectV1 { @Around("execution(* hello.aop.order..*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[..
-
Spring 핵심 원리 고급편 - 9. 스프링 AOP 개념Spring-Boot/스프링핵심원리 - 고급편 2022. 6. 8. 17:06
- 애플리케이션 로직은 크게 *핵심 기능* 과 *부가 기능*으로 나눌 수 있다 ㆍ핵심기능 : 해당 객체가 제공하는 고유의 기능 → 예를 들어 OrderService의 핵심 기능은 주문 로직이다. ㆍ부가기능 : 핵심 기능을 보조하기 위해 제공되는 기능 → 예를 들어 로그 추적로직, 트랜잭션 기능이 있다. - 예를 들어서 로그 추적 기능은 어떤 핵심 기능이 호출되었는지 로그를 남기기 위해 사용한다 - 부가기능은 이름 그대로 핵심 기능을 보조하기 위해 존재한다. 부가 기능 적용 문제 - 부가 기능을 적용할 때 아주 많은 반복이 필요하다 - 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어 낸다 - 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하다 - 부가 기능의 적용 대상을 변경할 때 많은 수정이 필요..