둘 다 중복 코드가 생기지 않도록 필요한 것을 모아놓았다는 점에서 비슷해 보인다. 갈리는 지점은 흐름을 제어하는 쪽이 누구인가 하나다.
개발 환경과 저장소
프레임워크는 Frame과 work를 합친 말 그대로 응용 프로그램이나 소프트웨어 솔루션 개발을 수월하게 하려고 제공되는 소프트웨어 환경이다. 자주 쓰는 범용 기능을 한꺼번에 제공해 개발 효율을 올린다. 공통적인 개발 환경을 주는 대신 개발할 수 있는 범위가 정해져 있고, 서로 협력하는 클래스와 인터페이스의 집합이라는 성격을 갖는다.
라이브러리는 개발에 필요한 기능을 모아 놓은 일종의 저장소다. 필요할 때 호출해서 쓰고, 독립성을 가진다.
스프링이라는 프레임워크
스프링은 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크다. 경량 컨테이너로서 자바 객체를 직접 관리해 생성과 소멸 같은 생명주기를 맡고, IoC로 느슨한 결합을 추구하며, DI로 객체 관계 구성을 지원한다. AOP로 OOP를 보완하고 MVC 패턴으로 계층을 분리해 유지보수를 쉽게 한다.
제어 흐름의 주인
내가 짠 코드가 프레임워크에 수동적으로 사용되면 프레임워크이고, 내가 라이브러리를 능동적으로 사용하면 라이브러리다. 앞쪽은 제어의 흐름이 역전된 형태이고 뒤쪽은 제어의 흐름이 개발자에게 있다. 내가 부르면 라이브러리, 나를 부르면 프레임워크다.
스프링과 스프링 부트
스프링과 스프링 부트의 차이는 셋으로 정리된다. 의존성부터 다르다. 스프링은 모든 의존성을 버전까지 한땀한땀 적어야 해서 목록이 매우 길었는데, 부트는 짧고 권장 버전을 자동으로 맞춰준다. 설정도 스프링은 config가 길고 빈도 직접 등록해야 했지만 부트는 application.properties나 요즘 많이 쓰는 application.yml 하나면 된다. yml은 depth로 표현해서 사람이 읽기 좋다.
가장 큰 차이는 내장 서버다. 스프링은 WAS가 내장되어 있지 않아 외장 WAS에 .war로 함께 빌드해야 했다. 부트는 톰캣이 내장되어 있어 .jar 하나로 실행된다.
java -jar $REPOSITORY/$JAR_NAME &서버 구동 시간이 절반 가까이 줄고 배포가 간단해진다. 톰캣이 싫으면 Jetty로 바꿔도 된다. 여기에 스프링 Security나 Data JPA 같은 다른 스프링 요소를 쉽게 쓸 수 있다는 것까지 더하면, 부트가 노린 것은 개발자가 개발에만 집중하게 만드는 일이다.