JVM언어의 특징?

장점과 단점

  1. 장점

    1. JVM

      자바의 코드는 기계어가 아닌, 바이트 코드이고 바로 이 바이트 코드를 실행시키기 위한 가상의 CPU가 필요한데 바로 이것이 Java Virtual Machine이 되는 것이다. 이 JVM 안에서 실행되기 때문에 OS 환경에 따라서 소스가 변경되지 않아도 된다는 장점이 있다. 즉, 이식성이 높다.

    2. GC

      가비지 컬렉션이 자동으로 더 이상 사용하지 않는 메모리 영역을 시스템 자원으로 돌려주는 기능이다. 즉, 메모리의 저장되어 있는 데이터를 관리 해준다.

  2. 프레임워크(Framework)

    1. IoC(Inversion of Control)
      • 제어의 역전, 인스턴스 생성 및 소멸을 컨테이너가 대신 수행한다.
      • 라이브러리 - 개발자's 코드 → 개발자가 호출
      • 프레임워크 → 개발자's 코드 → 프레임워크(Spring)가 개발자가 작성한 코드를 호출
    2. Class Library
    3. Design Pattern
      • 디자인 패턴 + 라이브러리
  3. Spring Framework 전략

    1. Portable Service Abstraction

      1. 서비스 추상화

        복잡한 기술을 인터페이스를 분리하여 개발자가 인터페이스만 바라볼 수 있게

    2. DI/IoC

      1. 의존성 주입

        의존성 주입을 개발자가 코드 상에 하지 않고, 어노테이션을 이용하여 스프링이 의존성을 주입하고 의존성 주입에 필요한 인스턴스의 라이프 사이클을 관리하는 것을 말한다. DI를 다른 말로 IoC(Invert of Controll, 역전제어)라고 도 한다.

    3. AOP

      1. 관점지향 프로그래밍

        트랜잭션이나, 로깅, 보안과 같이 공통적으로 필요로하는 모듈들을 비즈니스 로직 모듈에서 분리해서 공통으로 관리할 수 있다. 횡단 관심사에 대한 부분들을 따로 모듈화하는 것을 말한다.

    4. PSA(서비스 추상화)

    5. POJO(Plain Old Java Object)

      • 과거 J2EE(Java2 Enterprise Edition) 서버 기반의 자바 기술로, Servlet, JSP 레벨의 최소한의 서버 프로그래밍 인테페이스만 가지고는 엔터프라이즈급 어플리케이션을 제작하는 부담이 적지 않았다. 그리고 많은 사용자의 처리요구를 빠르게 안정적이면서 확장 가능한 형태로 유지하기 위해 필요한 로우레벨의 기술적인(트랜젝션 처리, 상태관리, 멀티쓰레딩, 리소스풀링, 보안등) 처리가 요구되었다.)
      • 그래서 탄생한 것이 EJB이다. EJB의 모토는 “어플리케이션 개발자의 개발을 쉽게 만들어 준다. 어플리케이션 개발자는 로우레벨의 기술들에 관심을 가질 필요도 없다” 였다. 이렇게 되면 개발자는 도메인과 비즈니스 로직에만 집중하면 된다.
      • 그런데 EJB에 과도한 엔지니어링으로 문제점이 발생한다.
        • EJB 규약을 따르는 비즈니스 오브젝트들은 객체지향 특징과 장점을 포기한 것이다.
      1. 평범한 자바 오브젝트, 특정 플렛폼에 종속되지 않는 라이브러리
      2. 자바 라이브러리를 특정 환경이나 규약에 종속되지 않고 JVM만 있으면 호출이 가능한 형태로 정의된 클래스를 제공한다.

1. Spring Boot 시작하기.

1.1 Hellow Spring Boot

  1. Intellij IDE에서 새로운 프로젝트를 생성한다. "Create New Project" 클릭 후, "maven" 프로젝트를 선택하고 생성한다.

  2. 프로젝트 생성 완료 후, Spring Boot 기본 설정을 pom.xml 파일에 아래 코드를 추가 한다.

    		<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
        </parent>
    

    이 프로젝트의 부모 프로젝트를 spring-boot-starter-parent 로 설정해주는 것이다.(의존성 관리와 관계 있는 선언)

    		<dependencies>
            <!-- <https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web> -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    

    의존성을 추가해준다.

    		<build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    

    Build Plugin도 추가해준다.

  3. src - main - java에 Package(com.ibricks)를 생성하고, Application.class 을 생성 후, main 함수를 정의 후에 SpringApplication 객체를 정의한다.

    package com.ibricks;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public Application {
    	public static void main(String[] args){
    		SpringApplication.run(Application.class, args);
    	}
    }
    
  4. Application.class 파일 실행을 하게 되면 Spring Boot(Apache-Tomcat)가 실행된다. [<http://localhost:8080>](<http://localhost:8080>) 으로 접근하면 Error화면 이지만, Tomcat에서 Response해주는 화면을 확인 할 수 있다.

1.2 Spring Boot 구조

Maven 기본 프로젝트와 동일한 구조를 가진다.

  1. src/main/java → java source 위치

  2. src/resouce → java source를 제외한 모든 것

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5fc1151c-288a-4f3c-bac3-4f946ad9262a/_2020-07-14__3.10.41.png

1.3 Bean 자동 구성AutoConfiguration

스프링은 자동으로 컴포넌트들을 구성할 수 있는 자동-구성 기능이 있어서 별도의 XML 구성이나 자바 구성이 없어도 된다.

자동 구성은 **자동 연결(Autowiring)**과 컴포넌트 검색(Component scanning)이라는 기법을 기반으로 한다. 컴포넌트 검색을 사용하여 스프링은 자동으로 애플리케이션의 classpath에 지정된 컴포넌트를 찾은 후 스프링 애플리케이션 컨텍스트의 빈으로 생성할 수 있다. 그리고 스프링은 자동 연결을 사용하여 의존 관계가 있는 컴포넌트를 자동으로 다른 빈에 주입한다.