이전 시간에 배운 것

1. 스프링은 프레임워크이다.
2. 스프링은 오픈소스이다.
3. 스프링은 IoC 컨테이너를 가진다.
4. 스프링은 DI를 지원한다.
5. 스프링은 엄청나게 많은 필터를 가지고 있다.
6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다.
7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.
8. 스프링은 BufferedReader와 BufferWriter를 쉽게 사용할 수 있다.
9. 스프링은 계속 발전중이다.


1. JPA란?

  • JPA는 Java Persistence API이다.
    Persistence: 영속성, 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다. 
    RAM은 휘발성 데이터를 저장한다. (전기로 데이터를 저장하기 때문) 이뜻은 컴퓨터가 꺼지면 다 사라진다는 말이다.
    이 데이터가 날라가지 않도록 램에있는 소중한 데이터들을 하드디스크에 기록하게 되면 하드디스크는 비휘발성이기 때문에 영구적으로 저장이 된다. 데이터가 영구히 기록되는것 = 영속성
    자바에서는 데이터 저장을 DBMS에 한다. 하드의 특정 영역을 잘라서 그 부분을 DBMS로 관리를 한다. 
    JAVA Persistence API라는 것은 자바에 있는 데이터를 영구히 기록할 수 있는 환경을 제공하는 API를 말한다.
    API는 무엇일까? : Application Programming Interface의 약자로, 프로그램을 만들기 위해 제공해주는 인터페이스이다.
    프로그래밍에는 프로토콜, 인터페이스 라는 개념이 있음
    둘다 약속을 의미하는데 방식이 조금 다르다.
    A와 B와 C라는 사람이 있다.
    1. B가 힘이 가장 세서 '이제부터 내게 연락을 할 때에는 전화하지말고 직접 찾아와라'라고 얘기를 했다. 이때 A와 C는 힘이 없기 때문에 B가 말한 규칙을 어쩔수 없이 지켜야한다. : 이때의 규칙을 인터페이스라고 한다. "상하관계가 존재하는 약속"
    2. 모두가 힘이 동일하면 A와 C는 싫다고 말할 수 있다. 그럼 B는 이 규칙을 내세울 수가 없다. 다른 대안책을 제시하고 서로에게 동의할 수 있는 약속을 만들어야한다. 이렇게 프로토콜은 동등한 관계에서의 약속이다. 

    JPA는 Java Persistence Application programming interface
    자바 프로그래밍을 할 때 영구적으로 저장을 하기 위해서 필요한 인터페이스를 의미한다.

  • JPA는 ORM 기술이다.
    ORM은 Object Relational Mapping의 약자로, 오브젝트를 데이터베이스에 연결하는 방법론 중 하나이다. 
    "ORM은 나의 하인 같은 기술"
    추상적인 개념을 현실세계로 뽑아내는 개념을 모델링이라고 한다.
    Team 테이블에 ID, Name, Year를 넣고 자바에서 사용을 할텐데, Input과 Output이 각각 DML(Delete, Update, Insert), Select라고한다. 자바는 테이블 데이터 타입을 가지지 않는다. 따라서 클래스를 통해서 데이터베이스의 테이블을 모델링해야한다.

class Team{
	int id;
    String name;
    String year;
}

DB 세상에 있는 데이터를 자바 세상에 모델링한다. 

그런데 ORM은 Class를 먼저 만들고 DB를 자동생성할 수 있는 기술이다. JPA가 가지고 있는 인터페이스 덕분에 자바 클래스를 짜면 테이블을 만들 수 있다. 

  • JPA는 반복적인 CRUD 작업을 생략하게 해준다.
    Select 1건
    Select All 전체
    Delete 1건
    Update 1건
    Insert 1건
    자바에서 DB로 연결하기위해서 신원을 확인하고 DB가 세션을 오픈하면 커넥션 시킬 수 있다. 이때 자바가 쿼리를 전송한다. DB는 해당 쿼리를 통해, 어떤 작업을 통해 데이터를 만들어내고, 자바에 응답한다. 응답시 DB 타입값과 자바 타입값이 다르기 때문에 자바 Object로 바꿔야한다. 이때 자바 Object로 바꾸는 작업은 단순한 반복노동이기에 JPA를 사용해서 전송된 쿼리에 대한 응답이 있을때 이 데이터를 받고 자바 오브젝트로 바꾸고 연결된 세션을 끊고, 연결된 커넥션을 끊고하는 이러한 모든 일련의 과정들을 함수 하나로 제공해준다. 기본적인 CRUD를 단순하게 처리하도록 도와준다. 이런 단순한 CRUD를 도와주는 것도 ORM이 해준다.

  • JPA는 영속성 컨텍스트를 가지고 있다.
    영속성 : 데이터 -> 영구적으로 저장하는 속성 (자바에서는 DB에 저장)
    컨텍스트란? Context: 모호한 개념 중 하나. 모든 컨텍스트를 가지고 있다 == 모든 정보를 가지고 있다. "대상의 모든 정보"
    영속성 컨텍스트에 있는 데이터와 DB 데이터는 동기화가 됨. 따라서 동물 데이터를 영속성 컨텍스트를 통해 DB에 입력했을때, 영속성 컨텍스트 내의 동물 데이터를 지우면 DB의 동물 데이터도 같이 지워짐. Select를 통해서 DB의 과일 데이터에 접근시 영속성 컨텍스트를 거쳐서 DB로 이동함. 영속성 컨텍스트에는 과일 데이터가 없기 때문에 자바 오브젝트로 바꾼 과일 데이터를 가진다. 영속성 컨텍스트는 자바 오브젝트 타입의 과일데이터를 자바에게 넘겨준다. 

    이때 자바, 영속성 컨텍스트, DB의 데이터는 서로 일치하는데, 자바에서 과일 데이터 중 사과를 딸기로 변환하면 영속성 콘텍스트에 있는 과일 데이터가 딸기로 변하고 커밋해서 밀어넣는 경우 과일 데이터의 형상이 달라져서 insert가 아니라 update가 일어난다. 

    자바는 항상 영속성 컨텍스트를 통해서 디비에 데이터를 저장하고, 데이터베이스의 데이터도 영속성 컨텍스트를 통해서 자바쪽으로 전달이 된다. 그리고 영속성 컨텍스트에서 일어난 모든 일들은 자동으로 처리가 된다.

  • JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
    야구 DB에 team(ID, Name, year)과 player(ID, Name, teamId) 테이블이 있다고 하자.
    각 컬럼들은 가질 수 있는 데이터가 기본 자료형이다. Object를 데이터로 가지지 않는다.
    자바의 관점에서 보면, 

Class Team {
	int id;
    String name;
    String year;
}

Class player {
	int id;
    String name;
    int teamId;
}

자바는 object를 저장할 수 있기 때문에,

Class Team {
	int id;
    String name;
    String year;
}

Class player {
	int id;
    String name;
    Team team;
}

이 될 수 있음. 
ORM 덕분에 자바가 주도권을 쥐고 있는 모델을 만들 수 있음.
또, JPA가 자동으로 DB에 FK(외래키) 데이터를 넣어줌.

  • JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)
  • 방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음
  • JPA는 쉽지만 어렵다.
이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

이전 시간에 배운 것

1. 스프링은 프레임워크이다.
2. 스프링은 오픈소스이다.
3. 스프링은 IoC 컨테이너를 가진다.
4. 스프링은 DI를 지원한다.
5. 스프링은 엄청나게 많은 필터를 가지고 있다.
6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다.


7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.
영어권 국가 사람과 한국 사람이 메세지를 주고 받을때. 안녕, Hello 이렇게 주고받을 것임. 송신자가 번역해서 보내면 송신자 입장에서 힘듦. 그래서 중간데이터라는 개념이 나옴. 한국어->영어, 영어->한국어 사이의 중간언어:xml->json 중간언어는 어떤 나라의 사람이던 잘 이해할 수 있는 언어임.
자바와 파이썬 간의 데이터 송수신은 json 오브젝트로 변경해서 던져주는 형식.
자바 object가 json으로 바뀌고 파이썬 object로 바뀐다.
한국말 - 영어 - 러시아어 이렇게 한국인과 러시아인이 영어로 소통할 수 있는 느낌
그렇다면 MessageConverter가 무엇이냐. 자바 오브젝트를 파이썬 오브젝트로 전송할때 내가 직접 컨버팅할 필요 없이 대신 번역해서 던져준다. 이때 요청할 때만 쓰는 것이 아니라 응답할때도 사용된다.

8. 스프링은 BufferedReader와 BufferWriter를 쉽게 사용할 수 있다.
통신할때 데이터는 전기선(전류)을 통해서 이동한다. 전류 흐름이 bit(0, 1)로 될텐데, 영어권 국가에서 영어 한문자를 보내는 방식으로 생각해보니 총 8bit가 필요했고 256가지의 문자를 전송할 수 있었다. 하지만 한글은 8비트로는 부족하다. 최소 16bit가 필요하다. 
영어권은 8bit 씩 끊어 읽으면 한 문자씩을 받을 수 있다. 그래서 8bit를 논리적으로 1바이트라 하며 통신의 최소 단위가 되었다. 
유니코드에서 UTF-8라는 표준 규격을 정해둠 3Byte짜리임.
Byte Stream: 1Byte, 8bit
Input stream: 바이트! 문자를 char로 캐스팅해서 처리해야하는데 InputSteramReader가 바이트를 문자하나로 바꿔서 넘겨줌
배열: 여러개의 문자를 받음. 크기가 정해져야함.
BufferedReader로 데이터를 감싸면 가변 길이의 문자를 받을 수 있다.
JSP에서는 request.getReader()
BufferedWriter / PrintWriter-> Print(), Println(), out()
전송 단위가 가변길이 문자열.
@ResponseBody -> BufferedWriter존재
@RequestBody -> BufferedReader 존재

9. 스프링은 계속 발전중이다.
스프링 부트가 나오고 나서 스프링 사용이 쉬워졌다. 

다음시간에 배울 내용

1. JPA란?

  • JPA는 Java Persistence API이다.
  • JPA는 ORM 기술이다.
  • JPA는 반복적인 CRUD 작업을 생략하게 해준다.
  • JPA는 영속성 컨텍스트를 가지고 있다.
  • JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
  • JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)
  • 방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음
  • JPA는 쉽지만 어렵다.
이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

'웹 개발 > Spring Boot' 카테고리의 다른 글

영속성 컨텍스트란 무엇인가요?  (0) 2023.07.31
ORM이란 무엇인가요?  (0) 2023.07.31
JPA란 무엇인가요?  (0) 2023.07.30
필터란 무엇인가요?  (0) 2023.07.29
스프링 부트의 핵심은 무엇인가요?  (0) 2023.07.29

이전 시간에 배운 것

1. 스프링은 프레임워크이다.
2. 스프링은 오픈소스이다.
3. 스프링은 IoC 컨테이너를 가진다.
4. 스프링은 DI를 지원한다.


5. 스프링은 엄청나게 많은 필터를 가지고 있다.
A 나라 성에는 왕궁이 있다. B나라는 A나라와 전쟁중이다. B나라의 스파이들은 A나라에 진입해서 들어오게된다. 이것을 막기 가장 좋은 방법은 입구에서 막는 것이다. ID카드를 확인하고 A나라 사람이면 들어가고 B나라 사람이면 막는 식으로 검열을 한다.

수많은 A나라 사람들 중에서 특정한 사람은 왕궁으로 가서 용무를 봐야할수도 있음. 이때는 특정 권한을 가진 사람들만 들어오도록 해야한다. 이때도 필터를 하나 걸어준다. 필터는 문지기역할을 한다.(임무) 임무는 우리가 내릴수도 있고 스프링 자체 기능도 있으며 사용되지 않는 필터를 사용하겠다고 할 수도 있다. 이때 위 그림에서 성이 톰캣, 왕궁이 스프링 컨테이너라고 생각하면 된다. (이때 톰캣 안에 스프링 컨테이너가 있는 것이 아닌, 톰캣을 거쳐서 스프링 컨테이너로 들어가는 것) 톰캣이 들고있는 필터는 filter라고 하며 이 기능을 하는 파일이 web.xml  스프링 컨테이너가 들고 있는 필터는 intercepter라고 하며 AOP(아직 배울 단계는 아님)와 관련이 있다고 한다.  

6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다.
어노테이션은 주석인데, 컴파일러에게 힌트를 주는 주석이다. -> 컴파일러가 무시하지 않음
Animal 클래스의 run() 메서드. Dog 클래스가 Animal 상속. run을 재정의 할 수 있는데, @override라고 붙이면 Dog을 컴파일 할 때, 컴파일러는 그 어노테이션을 보고 run() 메서드가 실제로 Animal 클래스에 있는지 확인을 하러 간다. 그런데 만약에 @override fly()라는 메소드가 있는 경우에, Animal 클래스에서 확인을 하고 없다는 것을 알게 되면 컴파일 체킹하면서 에러를 표시해준다.

스프링에서 어노테이션은 주로 객체를 생성한다. @Component, @Autowired, @Controller ... 스프링에서는 이런 어노테이션을 만들어두고 미리 약속을 한다.  Component: 클래스 메모리에 로딩, @Autowired: 로딩된 객체를 해당 변수에 집어넣음, 

스프링은 new방식보다는 IoC를 사용함-> 그래서 Class A { new ~~} 보다는 @Component Class A { ~ }를 통해 스캔시키고 A라는 클래스를 힙 메모리 공간에 로드한다. 

@Component 
Class A { 
	~~~
}

Class B에서 A 객체를 사용하고 싶다면 

Class B {
	A a = new A();
}

로 하면 완벽한 오답이다. 
여기서 A의 주소와 위에서 만든 A 주소가 다르기 때문에(new로 만들었기 때문) 다른 방법을 고민해야한다.

Class B {
	@Autowired
	A a;
}

와 같이 사용하여 참조할 수 있도록 한다. 이때 B 클래스내부에 어떤 애가 있는지 분석하는 기법을 리플렉션이라 하며, 메서드, 필드, 어노테이션을 체킹할 수 있다. 있는지만 체킹하는게 아니라 있다면 무엇을 해라 라고 설정까지 할 수도 있다. 
Autowired를 통해서 로딩된 객체들을 쭉 읽는다. 읽으면서 A와 동일한 타입의 객체가 떠있는지를 확인한다. 만약 A가 없다면 null이 들어간다. 만약에 있다면 a에 A가 들어간다. 이를 DI라고 한다.

어노테이션: 주석 + 힌트
리플렉션: 분석하는 기법 -> 런타임시 분석

다음 시간에 배울 것

7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.

8. 스프링은 BufferedReader와 BufferWriter를 쉽게 사용할 수 있다.

9. 스프링은 계속 발전중이다.

이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

1. 스프링은 프레임워크이다.
Frame(틀) Work(동작하다) -> 틀 안에서 동작을 한다.
프레임워크가 왜 나왔냐 -> 이 틀을 벗어나지 말고 만들어라 라는 의미가 있음.

2. 스프링은 오픈소스이다.
오픈소스란 소스코드를 공개한 것이다. 스프링의 내부를 볼 수 있는 것.-> 내부를 뜯어 고칠수 있는 것.
스프링을 공부하다가 깊숙한 곳까지 알게되었다. -> 불편한 점을 찾는다. -> 불편한 점을 고쳐서 컨트리뷰트(기여)할 수 있다. 

3. 스프링은 IoC 컨테이너를 가진다.
IoC(Inversion of Controll, 제어의 역전). -> 주도권을 스프링이 가지고 있다.
Class -> 설계도
Object -> 실체화가 가능한 것
Instance -> 실체화 된 것

class 누누 {
	변수
	변수
}

abstract class 캐릭터 {
	추상적인 의미
} ->  실체화가 불가능, object가 아님

가구는 실체화가 불가능함. 추상적이기 때문.
실체화 가능한 것은 의자, 침대 등이고 이것들이 object임.
그리고 주변에 있는 진짜 의자, 침대가 instance임.

오브젝트를 heap이라는 메모리 공간에 올리게 되면(new) 

public void make() {
    의자 s = new 의자();
}

의자를 new했기 때문에 의자 오브젝트를 실체화 시킨거임. 의자를 실체화시켜서 메모리에 띄움. 주소는 s가 가리키고 있음. 근데 s는 메서드가 실행되는 순간에만 메모리에 떠있음.

public void use(){
	의자 s = new 의자();
}

이렇게 하는 경우 make의 의자와 use의 의자는 서로 다른 주소값을 갖게 된다.

make의 의자를 쓰려면 어떻게든 넘겨 받아야함. 근데 이런 로직을 짜기가 굉장히 힘들다.

수많은 오브젝트들 (의자, 붕어빵, 사자, 기린 ....) 을 스프링이 스캔을 해서 읽고 객체들을 직접 heap에 넣는다.

4. 스프링은 DI를 지원한다.
Dependency Injection (의존성 주입): 내가 원하는 모든 클래스의 모든 메소드에서 오브젝트를 가져와서 사용할 수 있다. 만들어진 오브젝트 (의자)가 있으면 어느 클래스에서든 같은 의자를 사용하는 것이다. (싱글톤 패턴) 한번 뜬 의자를 어디서든 공유해서 쓸 수 있다. 

다음 시간에 배울 것

5. 스프링은 엄청나게 많은 필터를 가지고 있다.

6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다.

7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.

8. 스프링은 BufferedReader와 BufferWriter를 쉽게 사용할 수 있다.

9. 스프링은 계속 발전중이다.

이 블로그 포스팅은 인프런 최주호님의 스프링부트 개념정리(이론) 강의에 대한 정리 포스팅입니다. 
다음은 강사님의 강의 링크입니다. 무료 강의라서 가입만 하면 볼 수 있습니다. (강의 링크)

'웹 개발 > Spring Boot' 카테고리의 다른 글

영속성 컨텍스트란 무엇인가요?  (0) 2023.07.31
ORM이란 무엇인가요?  (0) 2023.07.31
JPA란 무엇인가요?  (0) 2023.07.30
메시지 컨버터가 무엇인가요?  (0) 2023.07.30
필터란 무엇인가요?  (0) 2023.07.29

오늘부터 시작합니다.

+ Recent posts