본문 바로가기
Spring | SpringBoot

[스프링 스터디] 2주차 - 스프링 입문

by saniii 2022. 1. 20.

# 1주차 정리 내용

2022.01.13 - [컴퓨터 언어/Spring | SpringBoot] - [스프링 스터디] 1주차 - 스프링 입문 


# 2주차 정리 내용

 

05. 회원 관리 예제 - 웹 MVC 개발

 

스프링 컨테이너에 관련된 컨트롤러가 없으면 정적 컨텐츠의 내용을 전달한다.

>> 컨트롤러가 정적 파일보다 높은 우선순위를 가진다.

김영한님의 수업자료

 


06. 스프링 DB 접근 기술

 

+ 순수 JDBC (Plain JDBC, Java DataBase Connectivity)

JDBC  : 자바 프로그램이 DB와 연결되어 데이터를 주고 받을 수 있게 하는 프로그래밍 인터페이스

- JAVA 기반 앱에서 JDBC-API -> JDBC driver를 통해 DB에 접근한다.

- 함수 호출용 SQL 인터페이스

- 공통된 SQL 인터페이스를 바탕으로 한다.

- JDBC 드라이버만 있으면 어떠한 DB에도 접속할 수 있다. 

- 익히고 사용하기 쉽다. 

JDBC 동작 흐름
1) JDBC 드라이버 로드
2) DB 연결
3) SQL문을 통해 DB 데이터 사용
4) DB 연결 종료

 

* JDBC 드라이버 : 각 DBMS와 통신을 담당하는 자바 클래스 

* JDBC의 문제점

  - 안정적이고 유연하지만 low-level 기술로 인식된다.

  - 반복되는 코드의 비효율성 

  -  DB로직에서 예외처리문 사용

  - 트랜젝션 처리

  - Connection과 같은 공유 리소스를 제대로 릴리즈 해주지 않으면 시스템의 자원이 바닥나는 버그를 발생

 

[참고]

https://lipcoder.tistory.com/entry/JDBC-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC  


** 트랜젝션 (Transaction) 

 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위 

: SQL문을 통해 데이터베이스에 접근하는 것.

 

+ 작업의 단위 : 사람이 정하는 기준에 따라 달라짐.

 

- 데이터를 다루는 것에 있어서 트랜잭션 설계를 잘 하는 것이 중요하다. 

 

****데이터베이스 공부하고 트랜잭션 정리글 첨부하기 

 

 

** @Transactional : 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다. 이 방식을 선언적 트랜잭션이라 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행해준다.

 

[참고] https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h 


+ JDBC template

: JDBC프로그래밍에 특화된 tool

 

- JDBC API를 사용하지만, JDBC의 문제점을 해결하기 위해 Spring에서 제공하는 class.

- JDBC template에서  생성, 연결, 결과값 객체, 예외처리, 트랜젝션처리를 해주고, 개발자는 쿼리문이나 값을 전달하는 코드만 작성하면 된다. 

 

 

+ JPA (Java Persistence API)

- ORM 방식으로 객체와 RDBS table을 매핑시켜서 사용

- SQL문도 작성해주기 때문에 객체 중심으로 설계하면 된다. 

 

>> 더 간단해진 방식 : Spring Data API 

 

* hibernate : 자바 ORM의 기술 표준인 JPA의 대표적인 오픈 소스


** ORM (Object-Relational Mapping, 객체-관계 매핑)

 : 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것

 - 객체 지향 프로그래밍은 클래스를, 관계형 데이터베이스는 테이블을 사용하므로 모델 간의 불일치가 발생

    >> ORM을 통해 SQL을 자동으로 생셩하여 불일치를 해결한다. 

- 객체를 통해 간접적으로 데이터베이스 데이터를 다룰 수 있다. 

- Persistant API 라고도 한다. 

 

+ 장점 

 - 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 집중할 수 있게 한다.

 - 재사용 및 유지보수의 편리성 증가

 - DBMS에 대한 종속성이 줄어든다.

 

+ 단점 

 - 완벽한 ORM으로만 서비스를 구현하기 어렵다. 

 - 프로시저가 많은 시스템에서는 ORM의 객체지향적인 장점을 활용하기 어렵다. 

   *프로시저 : 특정한 로직을 처리만 하고 결과값은 반환하지 않는 서브 프로그램

 

 [참고]

https://gmlwjd9405.github.io/2019/02/01/orm.html  

 

 

+ 스프링을 쓰는 이유, 객체지향적 설계가 좋은 이유

- 다형성을  활용할 수 있다.

   - 인터페이스를 두고 원하는대로 구현체를 바꿔끼기 할 수 있으며 이 동작이 편리하도록 스프링 컨테이저가 지원

- DI기능 덕분

 

기존의 코드는 손대지 않고 애플리케이션을 설정하는 코드 (어셈블리 코드)만 손대면 수정(구현 클래스 변경, 바꿔기기)이 쉽게 이루어질 수 있다.

 

* 객체 지향의 4대 특성 : 캡슐화, 상속, 추상화, 다형성 

 

[참고]

https://joychae.tistory.com/27 

 

 

+ SOLID 

- 자기 자신 클래스 안에 응집도는 내부적으로 높이고, 타 클래스간 결합도는 낮추기 위함

  (High Cohesion - Loose Coupling)

- 클래스당 하나의 책임을 부여하여 더욱 독립된 클래스를 만들고자 한다.

>> 결과적으로 소프트웨어는 재사용성이 높아지고, 수정이 최소화되어 유지보수가 용이해진다.

 

 1) SRP (Single Responsibility Principle, 단일 책임의 원칙)

: 관련된 책임만 부여하라 (추상화)

- 클래스를 설계할 때 애플리케이션의 경계를 정하고, 추상화를 통해 그 경계 안에서 필요한 속성과 메서드를 선택하여 설계

- 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크를 단일 책임을 주고, 독립적으로 모듈화시킴

 

 2) OCP (Open Close Principle, 개방 폐쇄의 원칙)

:  확장에는 열려있고, 수정, 변경에는 닫혀있다.

- 직접적으로 다른 클래스의 메서드를 호출하고 결합도 높게 설계하면 확장적이지 못하고, 많은 수정이 발생되어 유지보수가 힘들어짐.

- 상위에 인터페이스를 두어 직접적인 연동을 피하도록 설계

 

 3) LSP (the Liskov Substitution Principle, 리스코브 치환의 원칙)

: 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위클래스의 인스턴스 역할을 하는데 문제가 없어야한다.

즉, 인터페이스와 클래스, 상위 클래스와 하위 클래스 관계가 논리적으로 잘 설계 되어야 한다. 

 

 4) ISP (Interface Segregation Principle, 인터페이스 분리의 원칙)

: 상황과 관련있는 메서드만 제공할 것

 

 5) DIP (Dependency Inversion Principle, 의존성 역전의 원칙)

: 자신보다 변하기 쉬운 것에 의존하지 마라

- 추상 클래스, 상위 클래스는 구체적인 구현 클래스나 하위 클래스에 의존적이면 안된다. 

 (구체적인 클래스는 가장 전면적으로 노출되고 사용되므로 변화에 민감하다. )

 

 

[참고]

https://www.nextree.co.kr/p6960/  

https://limkydev.tistory.com/77  

 

 

 

 

 

* 스프링부트가 연결되지 않은 테스트를 하는 이유는 (순수한 단위테스트) 빠르고 더 좋은 테스트일 확률이 크다. 

컨테이너를 연결해야만 하는 테스트는 로직이 잘못됬을 확률이 높다. 

 

 

 

+ MyBatis

: 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크

- 복잡한 쿼리나 다이나믹한 쿼리에 강함.

- 프로그램 코드와 SQL쿼리의 분리로 코드의 간결성과 유지보수성을 높임.

[참고] https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC 

 

+ JPA vs MyBatis

- JPA의 장점

 

  • 1차캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능상 이점을 얻을 수 있다.
  • 코드 레벨로 관리 되므로 사용하기 용이하고 생산성이 높다.
  • 컴파일 타임에 오류를 확인할 수 있다.
  • 데이터베이스에 종속적이지 않으므로 특정 쿼리를 사용하지 않아 추상적으로 기술 구현이 가능하다.
  • 엔티티로 관리되므로 스키마 변경시 엔티티만 수정하게 되면 엔티티를 사용하는 관련 쿼리는 자동으로 변경된 내역이 반영된다.
  • 개발 초기에는 쿼리에 대한 이해가 부족해도 코드 레벨로 어느 정도 커버가 가능하다.
  • 객체지향적으로 데이터를 관리할 수 있다.
  • 부족한 부분은 다양한 쿼리 빌더와 호환하여 보안할 수 있다.

 

- JPA의 단점

 

  • JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있다. (로직이 복잡하거나 불필요한 쿼리가 발생할 수 있다.)
  • 초기에는 생산성이 높을 수 있으나 점차 사용하다 보면 성능상 이슈가 발생할 수 있다.(N+1, FetchType, Proxy, 연관관계)
  • 고도화 될수록 학습 곡선이 높아질 수 있다. (성능 이슈의 연장선으로 해결 방안에 따라 복잡한 내부 로직을 이해해야 할 필요가 있다)

 

 

- MyBatis의 장점

 

  • SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현할 수 있다.
  • 엔티티에 종속받지 않고 다양한 테이블을 조합할 수 있다.
  • 복잡한 쿼리도 SQL 쿼리만 작성할 수 있다면 손쉽게 작성할 수 있다.

 

- MyBatis의 단점

 

  • 스키마 변경시 SQL 쿼리를 직접 수정해주어야 한다.
  • 반복된 쿼리가 발생하여 반복 작업이 있다.
  • 런타임시에 오류를 확인할 수 있다.
  • 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다. 데이터베이스 변경시 로직도 함께 수정해주어야 한다.

- (insert, update, delete : jpa / select : mybatis)

 

 

* 컴파일타임 : 실행가능한 프로그램으로 만들어지는 과정

* 런타임 : 만들어진 프로그램이 사용자에 의해 실행되어 응용프로그램이 동작되어지는 때


07. AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)

 

: 어떤 로직을 기준으로 핵심 혹은 부가적인 관점으로 나누어 보고, 그 관점을 기준으로 각각 모듈화

* 모듈화 : 공통된 로직이나 기능을 하나의 단위로 묶는 것

 

@Around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행

출처: https://engkimbs.tistory.com/746 [새로비]

 

 

 

 

 

 

댓글