GDSC : Spring Framework

Springboot 개념 정리 + java 문법 개념

나영수 2022. 10. 1. 01:32

[Infearn 강의 참조(자바 ORM 표준 JPA 프로그래밍 - 기본편)]

 

0. 원래는 SQL문을 한개씩 다 작성해야 했다.
JPA가 나오면서 일일이 SQL 작성할 필요 없다. 마치 JAVA COLLECTION에 객체를 저장하고 조회하는 것처럼 단순하게 가능 -> 적절한 SQL 자동으로 불러옴


1. 객체와 관계형 데이터베이스의 차이

1) 상속 -> 객체에는 있는 개념이지만 DB에는 엄밀하게 봤을때 다른 개념의 상속이 존재한다.(TABLE 슈퍼타입 서브타입 관계)
2) 연관관계 ->JAVA는 GET을 이용해 가져오고 , DB의 경우 JOIN을 통해 TABLE을 합쳐서 가져온다.(객체는 참조를 사용, 테이블은 외래키를 사용한다.) => 객체는 단방향적으로 데이터 FLOW가 있고 테이블은 양방향적이다.
3) 데이터 타임
4) 데이터 식별 방법

2. SQL이 DB가 알아듣는 언어이므로 모든 언어가 SQL에 의존적이다. -> 객체를 SQL로 변환해야 한다.

패러다임의 불일치(객체와 관계형 DB) -> 객체는 FIELD, METHOD를 잘 캡슐화해서 보관하는 것을 목적(객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.)

--> 내 생각에는 객체지향형 DB와 객체가 잘 어울리는데 현재 관계형 DB 시장이 꽉 잡고 있어서 이런 문제가 생기는 것 같다.


cf) 엔티티 신뢰문제를 처리하기 위해 모든 객체를 미리 로딩할 수는 없기 때문에 상황에 따른 조회 메소드를 다르게 한다.

cf) 자바 컬렉션에서 똑같은 객체를 사용하면 같은 참조를 하고 있으므로 같다고 나온다.

객체지향답게 모델링 할 수록 매핑작업만 늘어난다. 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수 없을까? -> JPA가 해결

3. JPA 무엇인가? (JAVA PERSISTANCE API) ->자바 진영의 ORM기술 표준
***ORM(OBJECT-RELATIONAL MAPPING) -> 객체와 관계형 데이터베이스 따로 설계 
JPA는 인터페이스의 모음이다.   -> 조금 더 구체적인 모델을 찾아봐야한다.

4. JPA 왜 사용해야할까?
1) 유지보수에 좋다
2) 관계형 데이터베이스와의 패러다임의 불일치를 해결해 준다. -> SQL을 자동으로 해주기 때문에 여러번 문법을 작성할 필요 X
3) 자유로운 객체 그래프 탐색이 가능하다.
4) JPA에서는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.

5. JPA의 성능 최적화 기능
1) 같은 트랜잭션 안에서는 같은 엔티티를 반환 (캐싱을 하고 있어서 다시한번 메모리에 접근할 필요가 없다)
2) 트랜잭션을 지원하는 쓰기 지연 ->transaction.commit(); 을 하면 메모리에 해당 내용을 쌓아놓고 트랜잭션 커밋옵션을 줬을때 한번의 네트워크를 통해 DB에 보낸다.(시간이 줄어듬)
3) 지연로딩과 즉시 로딩 -> 옵션으로 쉬워지게 한다?    -> 질문사항

6. MAVEN 과 GRADLE의 차이점?

일단 둘 모두 빌드 관리 도구이다. 즉 쉽게 생각해서 라이브러리를 관리해주는 툴이라고 생각하면 된다.
위에서 말하는 '빌드'란 개발자가 작성한 고급언어를 jvm, tomcat과 같은 web application server가 인식할 수 있는 언어로 변환하는 과정을 의미한다. (전체적인 구조를 봤을때 고급언어는 컴파일러를 통해서 어셈블리어로 변환되고 어셈블리어는 어셈블러를 통해 기계언어로 변화되는 구조이다.)

- Maven은 pom.xml 파일에 프로젝트에 필요한 각종 의존성들과 라이브러리를 추가해서 사용한다. 그리고 빌드에 대한 대부분의 책임을 각 플러그인에 위임한다. 이러한 플러그인들은 maven repository에 저장되어진다. [pom.xml]

-Gradle은 Ant Builder와 Grooby Script을 기반으로 구축되어 기존 Ant의 역할과 배포 스크립의 기능을 모두 사용가능하며 스프링부트와 안드로이드에서 사용된다. [build.gradle]


- 가장 중요한 점은 빌드 속도가 maven에 비해 10-100배 가량 빠름

- 기존의 maven의 경우 xml로 라이브러리를 정의하고 활용되었으나 gradle은 별도의 빌드 스크립트를 통해 어플리케이션 버전, 라이브러리 등의 항목을 설정할 수 있다. 또한 groovy 스크립트 언어로 구성되어 있어 소스 코드가 그대로 실행되어서 따로 java를 컴파일할 필요가 없어서 속도가 빠르다. 그리고 java 클래스 파일을 그대로 groovy 클래스로 사용할 수 있다고 한다. 

- gradle이 maven보다 훨씬 적의 양의 스크립트로 짧고 간결하게 작성할 수 있다.

- maven은 정적 형태인 xml기반으로 작성되서 동적인 빌드를 적용하면 어려움이 많다. gradle은 groovy를 사용하므로 groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 되기때문에 어려움이 없다.(??)

- maven의 경우 멀 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속을 받아야 하지만, gradle은 설정 주입 방식을 사용하기 때문에 멀티 프로젝트에 매우 적합하다.

7. java 8 부터 바뀐 문법인 stream , lambda , collection의 개념 정리

1. Stream : 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드패턴이다. 내부 반복자를 사용하기 때문에 병렬처리가 쉽다.

2. lambda : 익명함수(함수의 이름이 없는 함수)를 지칭하는 용어이다. 간단히 말하면 함수를 보다 단순하게 표현하는 방법이다.

3. collection : 데이터의 집합, 그룹을 의미하고 java collection framework는 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다. 이 인터페이스는 크게 List, Set, Queue 3가지로 분류할 수 있다.

 

<다음 글쓰기 목표>

1) 객체와 테이블을 정확하게 매핑하고 설계하는 방법 알아보기

2) JPA의 내부 동작 방식을 이해해야 한다. -> 어떤 SQL을 만들어내는지 ...

3) 객체지향언어, 관계형 DB개념

 

4) java8부터 바뀐 문법 실제로 적용해서 알고리즘 풀기