Java 프로그램에서 모든 소스 코드는 텍스트 파일로 작성되고 .java 확장자를 가진다.
이 소스코드가 javac 컴파일러에 의해 컴파일 되어 .class 파일로 만들어진다.
이 .class 파일은 실행되는 컴퓨터의 네이티브 코드(native code)를 가지고 있지 않은 상태로 바이트코드(bytecode)를 가지고 있다
바이트코드는 JVM(Java Virtual Machine: 자바가상기계)에서 실행될 수 있는 기계어 코드이다.
JVM이 설치되어 있는 컴퓨터에서 java 명령어를 사용하여 .class 파일을 실행한다.

.class 바이트 코드는 JVM이 설치된 어떤 이기종 컴퓨터에서도 실행이 가능하다.
또한, JVM은 Java 프로그램과 하드웨어 사이에 위치하여 Java 프로그램 개발을 위한 API를 제공하고 Java 바이트코드를 해석항 실행하는 역할을 한다.
스프링의 진짜 핵심
- 스프링은 자바언어 기반의 프레임워크
- 자바 언어의 가장 큰 특징 - 객체 지향 언어
- 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
<-> 이전에 존재한 EJB은 객체 지향 특징을 잃어버리게 사용한다.
객체 지향 특징
- 추상화
- 캡슐화
- 상속
- 다형성
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 '객체'들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. (협력)
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
유연하고, 변경이 용이하다? 이게 무엇이냐
- 레고 블럭 조립하듯이
- 키보드, 마우스 갈아 끼우듯이
- 컴퓨터 부품 갈아 끼우듯이
- 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법이다.
-> 다형성

자동차의 역할은 앞으로 가는 것이다.
자동차가 바뀌어도 운전자에게 영향을 주지 않는다.
이를 통하여서 운전자는 자동차의 역할에 의존하고 있음을 알 수 있다.
운전자는 자동차의 내부구조를 몰라도 된다.
내부적으로 바뀌어도 자동차 역할만 그래도 맞춘다면 사용자에게 영향을 주지 않는다.
이를 통하여서 운전자에게 영향을 주지 않고 새로운 기능을 제공할 수 있다
이것이 가능한 이유는 역할과 구현으로 세상을 구분하였기 때문이다.

유연하고 변경이 용이하다.
역할 > 구현 ( 역할이 구현보다 중요하다 )

서버가 클라이언트가 되어서 다른 서버에게 요청할 수 있다.
해당 부분에서 응답이, 꼭 데이터를 넣어서 return 값이 없어도 된다.
IoC(Inversion of Control) 제어의 역전
할리우드 원칙을 들어서 설명하곤 한다. DI
SOLID