
스프링 프레임워크란?
Spring Framework 또는 간단히 Spring은 Java로 웹 애플리케이션을 만드는 데 가장 많이 사용되는 프레임워크 중 하나입니다. 프레임워크는 라이브러리와 비슷하지만(아마도 이 용어에 더 익숙할 것입니다) 고려해야 할 사항이 있습니다. 대략적으로 말하면, 라이브러리를 사용할 때 라이브러리에 포함된 클래스의 인스턴스를 만들고 필요한 메서드를 호출하여 필요한 결과를 얻으면 됩니다. 즉, 이것은 보다 명령적인 접근 방식입니다. 프로그램에서 어떤 개체를 만들어야 하는 특정 순간, 어떤 특정 메서드를 호출해야 하는 시기 등을 명시적으로 지정합니다. 프레임워크에서는 상황이 약간 다릅니다. 자신만의 클래스를 작성하고 그 안에 로직을 작성하면 프레임워크 자체가 클래스의 인스턴스를 생성하고 해당 메서드를 호출합니다. 클래스는 일반적으로 프레임워크에서 일부 인터페이스를 구현하거나 일부 클래스를 상속하므로 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. 따라서 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. 따라서 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. Spring은 이러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 가능한 한 많이 피하려고 합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. Spring은 이러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 가능한 한 많이 피하려고 합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. ) 또한 Spring은 웹 응용 프로그램뿐만 아니라 우리 모두에게 매우 친숙한 가장 일반적인 콘솔 프로그램에도 사용할 수 있다는 점을 바로 주목하고 싶습니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. ) 또한 Spring은 웹 응용 프로그램뿐만 아니라 우리 모두에게 매우 친숙한 가장 일반적인 콘솔 프로그램에도 사용할 수 있다는 점을 바로 주목하고 싶습니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다.구조
그러나 Spring은 하나의 특정 프레임워크가 아닙니다. 오히려 그것은 각각 고유한 종류의 작업을 수행하는 여러 개의 작은 프레임워크를 가리키는 데 사용되는 일반적인 이름입니다.
https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
그림 2.1. 스프링 프레임워크 개요
- 데이터 접근
- 편물
- 핵심
- 그리고 더
Java에 Spring Framework가 있는 이유는 무엇입니까?
뭐, 패셔너블하고, 세련되고, 신선하다는 점 외에도 Spring을 사용해서 약간의 스킬이라도 익히는 순간, 없는 일이 얼마나 많은지 알게 될 것이라고 지금 당장 말씀드릴 수 있습니다. 해야 할 일과 Spring이 스스로 수행하는 작업의 양. 수십 줄의 구성 설정을 작성하고 몇 개의 클래스를 작성할 수 있으며 작업 프로젝트로 끝납니다. 그러나 일반 서블릿이나 소켓 및 순수한 Java를 기반으로 동일한 프로젝트를 구현하려는 경우 내부에 얼마나 많은 작업이 있는지, 얼마나 많은 작업이 수행되고 있는지, 그리고 얼마나 많은 코드를 작성해야 하는지 궁금해지기 시작하면 머리카락이 쭈뼛 서게 될 거예요 :) 봄은 일종의 마법이라고도 합니다. 모든 것이 작동하는 것을 볼 때 이것을 경험합니다. 하지만 어떻게 그리고 얼마나 많은 작업이 배후에서 일어나고 있는지에 대한 대략적인 아이디어도 가지고 있습니다. 따라서 실제로 어떤 종류의 마법이 작동하는 것 같습니다 :) 모든 것이 어떻게 상호 연결되어 있는지 설명하는 것보다 마법이라고 부르는 것이 더 쉽습니다. :) Spring 공부에 찬성하는 두 번째 주장은 주니어 개발자를 위한 채용 공고의 약 90%(내 개인적인 관찰에 근거)가 Spring이 무엇인지에 대한 지식이나 적어도 일반적인 아이디어를 필요로 한다는 것입니다.Data
, Web MVC
및 Security
모듈은 정교한 개발자를 제공합니다 :) 그러나 오늘은 기본에 관한 것입니다.
DI/IOC
Spring에 대해 읽으려고 시도한 적이 있다면 가장 먼저 접한 것은 아마도 DI/IoC라는 두문자어일 것입니다. 이제 이 글은 잠시 쉬고 이 DZone 글을 읽어보시길 강력히 추천합니다 ! IoC는 Inversion of Control의 약자입니다. 라이브러리를 사용하면 코드에서 어떤 객체를 호출할 메서드를 직접 지정해야 하지만 일반적으로 프레임워크를 사용하면 프레임워크가 적시에 코드를 호출한다는 의미입니다. 즉, 후자의 경우 코드/프로그램 실행 프로세스를 더 이상 관리하지 않습니다. 프레임워크가 이를 수행합니다. 제어를 프레임워크에 전달했습니다(제어 역전). DI는 종속성 주입을 나타냅니다.. 종속성 주입을 사용하면 기본 메서드에서 고양이 개체를 만든 다음 메서드에 전달하지 않습니다. 대신 Spring Framework에서 자동으로 생성합니다. "I want to get a cat here"와 같은 말만 하면 프레임워크가 메서드에서 고양이를 전달합니다. 향후 기사에서 이 약어를 볼 수 있습니다.빈과 컨텍스트
Spring의 핵심 개념 중 하나는 bean입니다. 사실 이것은 일부 클래스의 객체일 뿐입니다. 고양이, 개, 앵무새 등 3개의 개체가 필요한 프로그램이 있다고 가정합니다. 그리고 우리는 많은 방법을 가진 많은 클래스를 가지고 있습니다. 때때로 우리는 방법을 위해 고양이가 필요하고, 때로는 다른 방법을 위해 개가 필요하며, 때로는 우리의 방법이 고양이와 앵무새 모두를 필요로 합니다(예를 들어, 고양이에게 먹이를 주는 방법, 하하). 또 다른 방법의 경우 세 개체가 모두 필요합니다. 예, 먼저 기본 메서드에서 이 세 개체를 생성한 다음 클래스에 전달한 다음 이 클래스 내에서 관련 메서드로 전달할 수 있습니다... 전체 프로그램에서 이런 식으로 진행됩니다. 그러나 때때로 메소드에 대한 입력 매개변수 목록을 변경하려는 경우(예: 무언가를 다시 작성하거나 새로운 기능을 추가하기로 결정한 경우) 코드를 꽤 많이 변경해야 합니다. 이제 그러한 객체가 3개가 아니라 300개 있다고 상상해 보십시오. 한 가지 대안은 모든 개체를 하나의 목록에 모으는 것입니다(List<Object>
), 모든 메서드에 전달한 다음 메서드 내부에 있는 동안 필요한 개체를 가져옵니다. 그러나 프로그램이 실행될 때 어떤 개체가 이 목록에 추가되거나 더 나쁜 경우 하나가 삭제되면 어떻게 될까요? 이는 목록에서 개체를 가져오기 위해 인덱스를 사용하는 모든 메서드를 중단할 가능성이 있습니다. 이 문제를 피하기 위해 객체를 목록이 아닌 맵에 저장하기로 결정했습니다. 여기서 키는 객체 이름이고 값은 객체 자체입니다. 이를 통해 get("parrot")과 같은 이름을 사용하여 필요한 개체를 검색할 수 있으며 이에 대한 응답으로 앵무새 개체를 얻습니다. 또는 키는 객체의 클래스일 수 있고 값은 객체 자체일 수 있습니다. 이 경우 개체의 이름을 지정하는 대신 필요한 개체의 클래스만 지정할 수 있습니다. 그것도 편리합니다. 또는 지도에 대해 일종의 래퍼를 작성할 수도 있습니다. 여기서 일부 메서드는 이름으로 개체를 가져오고 다른 메서드는 클래스로 개체를 가져옵니다. 우리가 여기까지 도달한 것은Spring Framework의 애플리케이션 컨텍스트 . 컨텍스트는 Bean(객체)의 모음입니다. 이름, 유형 또는 다른 방법으로 필요한 빈(객체)을 얻기 위해 컨텍스트에 액세스합니다. 또한 Spring 자체에 요청하여 필요한 빈을 자체 컨텍스트에서 찾아 메서드에 전달하도록 요청할 수 있습니다. 예를 들어 다음과 같은 메서드가 있다고 가정합니다.
public void doSomething(Cat cat) {
...
}
Spring이 이 메소드를 호출했을 때 컨텍스트에서 cat 객체를 가져와 메소드에 전달했습니다. 그러나 이제 우리는 고양이 외에 앵무새도 필요하다고 결정했습니다. Spring을 사용하면 이보다 더 쉬울 수 없습니다! 간단히 다음과 같이 작성합니다.
public void doSomething(Cat cat, Parrot parrot) {
...
}
이제 Spring이 우리 메서드를 호출할 때 고양이와 앵무새를 전달해야 할 필요성을 이해하므로 컨텍스트로 이동하여 이 두 개체를 가져와 메서드에 전달합니다. 통제의 고삐를 Spring으로 이전함으로써 우리는 또한 객체를 생성하고 Spring이 호출할 메서드에 객체를 전달하는 책임을 이전합니다. 이것은 다음과 같은 질문을 합니다. Spring은 어떤 객체(bean)를 생성해야 하는지 어떻게 알 수 있습니까?
애플리케이션을 구성하는 방법
애플리케이션을 구성하는 세 가지 주요 방법이 있습니다 . 즉, 필요한 객체를 정확히 Spring에 알리는 방법입니다.- XML 구성 파일
- Java 기반 구성
- 자동 구성
- 가장 우선적으로 선호되어야 하는 방법은 자동 구성입니다.
- 자동 구성을 사용하여 가능한 모든 bean을 올바르게 구성할 수 없는 경우 Java 기반 구성(Java 코드를 사용하여 개체 생성 포함)을 사용하십시오.
- 우선 순위가 가장 낮은 방법은 XML 구성 파일을 사용하는 구식 방법입니다.
GO TO FULL VERSION