JavaRush /Java Blog /Random-KO /봄은 게으른 자의 것이다. 코드가 포함된 기본, 기본 개념 및 예제입니다. 1 부
Стас Пасинков
레벨 26
Киев

봄은 게으른 자의 것이다. 코드가 포함된 기본, 기본 개념 및 예제입니다. 1 부

Random-KO 그룹에 게시되었습니다
많은 사람들은 웹 프로젝트를 위한 템플릿 생성서블릿을 사용하여 간단한 웹 서비스 생성 에 대한 내 기사를 읽은 후 언제 Spring에 대해 글을 쓸지 궁금해했습니다. 나는 원하지 않았고 책을 읽으라고 제안했습니다. (그리고 나는 여전히 책이 인터넷에서 10개, 심지어 100개의 기사보다 낫다고 말합니다.) 하지만 이제는 같은 내용을 다른 사람들에게 설명하는 것이 한 번 앉아서 기사를 쓴 다음 링크를 게시하는 것보다 더 많은 시간을 소비하기로 결정했습니다. 그래서 링크를 위해 글을 쓰고 있습니다)). 봄은 게으른 자의 것이다.  코드가 포함된 기본, 기본 개념 및 예제입니다.  파트 1 - 1이 기사에서는 예제를 따라 5분 만에 Spring에서 작업 프로젝트를 만드는 방법을 쓰지 않을 것입니다. 나는 프로젝트를 시작하는 것이 확실히 가능하다는 지식 없이 기본적인 것들에 대해서만 쓸 것입니다. 그러나 거기에서 무슨 일이 일어나고 있는지, 그리고 더 중요한 것은 왜 명확하지 않을 것입니다.

스프링 프레임워크란 무엇인가요?

Spring Framework 또는 간단히 Spring은 Java로 웹 애플리케이션을 만드는 데 가장 널리 사용되는 프레임워크 중 하나입니다. 프레임워크 는 라이브러리와 유사하지만(아마도 이 용어가 여러분에게 더 친숙할 것임) 한 가지 요점이 있습니다. 대략적으로 말하자면, 라이브러리를 사용하면 그 안에 있는 클래스의 개체를 만들고 필요한 메서드를 호출하여 필요한 결과를 얻을 수 있습니다. 즉, 보다 필수적인 접근 방식이 있습니다. 어떤 객체를 생성해야 하는 특정 순간, 특정 메서드를 호출해야 하는 순간 등을 프로그램에 명확하게 표시합니다. 프레임워크에서는 상황이 약간 다릅니다. 자신만의 클래스 일부를 작성하고 거기에 로직의 일부를 작성하면 프레임워크 자체가 클래스의 개체를 생성하고 메서드를 호출합니다. 대부분의 경우 클래스는 프레임워크에서 일부 인터페이스를 구현하거나 프레임워크에서 일부 클래스를 상속하여 이미 작성된 기능 중 일부를 받습니다. 하지만 꼭 그렇게 될 필요는 없습니다. 예를 들어 Spring에서는 가능한 한 이러한 엄격한 결합에서 벗어나려고 노력하고(클래스가 이 프레임워크의 일부 클래스/인터페이스에 직접 의존하는 경우) 이러한 목적으로 주석을 사용합니다. 우리는 나중에 이 점으로 돌아올 것입니다. 그러나 Spring은 이미 여러분을 위해 작성된 일부 클래스와 인터페이스의 집합일 뿐이라는 점을 이해하는 것이 중요합니다 :) 저는 또한 Spring이 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔에도 사용될 수 있다는 점을 즉시 언급하고 싶습니다 . 우리 모두에게 너무나 익숙한 애플리케이션 그리고 오늘 우리는 그런 것도 쓸 것입니다.

구조

그러나 Spring은 하나의 특정 프레임워크가 아닙니다. 이는 각각 서로 다른 작업을 수행하는 여러 작은 프레임워크의 일반적인 이름입니다.
봄은 게으른 자의 것이다.  코드가 포함된 기본, 기본 개념 및 예제입니다.  파트 1 - 2
보시다시피 스프링은 모듈식 구조를 가지고 있습니다. 이를 통해 애플리케이션에 필요한 모듈만 연결할 수 있고 분명히 사용하지 않을 모듈은 연결할 수 없습니다. 내가 아는 한, Spring이 당시의 경쟁자(EJB)를 능가하고 선두를 차지할 수 있었던 것은 이러한 접근 방식이었습니다. EJB를 사용하는 애플리케이션은 많은 종속성을 가져왔고 일반적으로 느리고 서투른 것으로 나타났습니다. 이미지는 스프링 프레임워크가 여러 모듈로 구성되어 있음을 보여줍니다.
  • 데이터 접근;
  • 편물;
  • 핵심;
  • 다른 사람.
오늘 우리는 빈, 컨텍스트 및 기타와 같은 기본 모듈의 몇 가지 개념에 대해 알게 될 것입니다. 짐작할 수 있듯이 데이터 액세스 모듈에는 데이터 작업(주로 데이터베이스), - 네트워크 작업(나중에 설명할 웹 애플리케이션 생성 포함)을 위한 도구가 포함되어 있습니다. 또한 소위 전체 Spring 인프라도 있습니다. 프레임워크 자체에 공식적으로 포함되지는 않지만 Spring 프로젝트에 원활하게 통합되는 다른 많은 프로젝트입니다( : 언젠가 우리도 느낄 수 있기를 바랍니다.)

왜 Java에서 Spring을 사용하는가?

글쎄요, 그것이 패셔너블하고 스타일리쉬하며 젊다는 사실 외에도, 그것을 조금만 익히면 지금은 얼마나 많은 다른 일을 할 필요가 없고 봄이 얼마나 많은지 이해할 수 있을 것이라고 즉시 말할 수 있습니다. 맡는다. 수십 줄의 구성을 작성하고 클래스 몇 개를 작성하면 작동하는 프로젝트를 얻을 수 있습니다. 그러나 "내부"에는 얼마나 많은 것이 있는지, 수행 중인 작업의 양은 얼마나 되는지, 동일한 프로젝트를 베어 서블릿이나 소켓 및 순수 Java에서 수행했다면 얼마나 많은 코드를 작성해야 하는지 생각하기 시작하자마자 -머리카락이 쭈뼛 섰어요 :) 봄의 '마법' 같은 표현도 있어요. 이때 모든 것이 작동하고 있음을 알 수 있지만 모든 것이 작동하기 위해 그곳에서 얼마나 많은 일이 일어나야 하는지, 그리고 그곳에서 모든 것이 어떻게 작동하는지 대략적으로 추정합니다. 그러면 이 모든 것이 실제로 일종의 마법 덕분에 일어나는 것 같습니다.)) 그것이 어떻게 상호 연결되어 있는지 설명하려고 하기보다는 그것을 모두 마술이라고 부르십시오. :) 글쎄요, Spring 학습을 "위한"두 번째 주장은 후배를위한 공석의 약 90 %에서 (내 개인적인 관찰에 따르면) 신사의 Spring 세트에 대한 지식이나 적어도 일반적인 아이디어가 있다는 것 입니다 data. :) 기본만 필요합니다. web-mvcsecurity

DI/IoC

Spring에서 무언가를 읽으려고 한다면 가장 먼저 접하게 되는 것은 아마도 다음과 같은 문자일 것입니다: DI/IoC . 이제 이 기사에서 잠시 벗어나 Habré에 관한 이 기사를 읽어 보시기 바랍니다 ! IoC(제어 반전) - 제어 반전. 라이브러리를 사용할 때 호출할 객체의 어떤 메서드를 코드에 직접 작성해야 하며, 프레임워크의 경우 프레임워크는 오른쪽에 작성한 코드를 호출하는 경우가 가장 많다고 썼을 때 이미 언급했습니다. 순간. 즉, 여기서는 더 이상 코드/프로그램 실행 프로세스를 제어하지 않지만 프레임워크가 이를 수행합니다. 귀하는 그에게 통제권을 이전했습니다(지배권 역전). DI는 종속성 반전 (종속성 반전, 한 클래스가 다른 클래스에 직접 연결되는 모듈/클래스 간에 하드 연결을 만들지 않으려는 시도) 또는 종속성 주입 (종속성 주입, 이는 cat 객체가 그렇지 않은 경우) 으로 이해됩니다. 메인에서 당신이 생성한 다음 당신은 그것을 당신의 메소드에 전달하고, Spring은 당신을 위해 그것들을 생성하고, 당신은 그에게 "여기에 고양이를 키우고 싶다"라고 말하면 그는 그것을 당신의 메소드에서 당신에게 전달합니다. 우리는 다음 기사에서 두 번째를 더 자주 접하게 될 것입니다.

빈과 컨텍스트

Spring의 주요 개념 중 하나는 bean 입니다 . 본질적으로 그것은 단지 일부 클래스의 객체일 뿐입니다 . 우리 프로그램에서 고양이, 개, 앵무새의 세 가지 개체를 사용해야 한다고 가정해 보겠습니다. 그리고 우리는 여러 메서드가 있는 여러 클래스를 가지고 있습니다. 때로는 메서드에 고양이가 필요하고 다른 메서드에는 개가 필요하며 때로는 고양이와 앵무새가 필요한 메서드도 있습니다(예: 메서드 고양이에게 먹이를 주려면 헤헤), 어떤 방법에서는 세 가지 개체가 모두 필요할 것입니다. 예, 먼저 메인에서 이 세 가지 개체를 만든 다음 이를 클래스에 전달하고, 클래스 내에서 필요한 메서드로 전달할 수 있습니다. 프로그램 전체에서 이런 식으로 진행됩니다. 그리고 주기적으로 메소드에 허용되는 매개변수 목록을 변경하고 싶다고 생각한다면(음, 무언가를 다시 작성하거나 기능을 추가하기로 결정했습니다) 필요한 경우 코드를 상당히 많이 편집해야 합니다. 무언가를 바꾸다. 이제 그러한 객체가 3개가 아니라 300개 있다고 상상해 보면 어떨까요? 대안은 그러한 모든 객체를 하나의 공통 객체 목록( List<Object> )으로 수집하여 모든 메소드에 전달하고 메소드 내부에서 필요한 객체 또는 객체를 가져오는 것입니다. 하지만 프로그램이 진행됨에 따라 일부 개체가 이 목록에 추가되거나 (더 나쁜 것은) 삭제될 수 있다고 상상한다면 어떻게 될까요? 그런 다음 목록에서 색인으로 개체를 검색하는 모든 방법에서 모든 것이 중단될 수 있습니다. 그런 다음 목록이 아닌 맵을 저장하기로 결정합니다. 여기서 키는 필요한 객체의 이름이 되고 값은 객체 자체가 됩니다. 그러면 이름만으로 필요한 객체를 얻을 수 있습니다. : get("parrot") 그리고 이에 대한 응답으로 앵무새 개체를 받았습니다. 또는 예를 들어 키가 객체의 클래스이고 값이 객체 자체라면 더 이상 객체의 이름을 표시할 수 없고 단순히 필요한 객체의 클래스만 표시할 수 있어 편리합니다. 또는 지도 위에 일종의 래퍼를 작성하여 어떤 경우에는 이름으로, 다른 경우에는 클래스별로 객체를 검색할 수 있도록 메서드를 만들 수 있습니다. 이것이 스프링 애플리케이션 컨텍스트 에서 얻은 것입니다 . 컨텍스트는 Bean(객체)의 집합입니다. 컨텍스트를 살펴보면 이름이나 유형 등으로 필요한 빈(객체)을 얻을 수 있습니다. 게다가 우리는 Spring에게 컨텍스트에서 필요한 빈을 찾아 메소드에 전달하도록 요청할 수 있습니다. 예를 들어, 다음과 같은 메소드가 있다고 가정해 보겠습니다.
public void doSomething(Cat cat) {
    ...
}
Spring이 우리를 위해 이 메소드를 호출했을 때, Spring은 컨텍스트에서 고양이의 객체를 전달했습니다. 이제 우리는 고양이 외에 앵무새도 필요하다고 결정했습니다. 스프링을 사용하면 이보다 더 쉬운 일은 없습니다! 우리는 간단히 다음과 같이 씁니다:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
그리고 Spring이 이 메소드를 호출할 때 여기에서 고양이와 앵무새를 전달하고 컨텍스트로 이동하여 이 두 객체를 가져와서 우리 메소드에 전달해야 한다는 것을 이해합니다. 우리 프로그램의 고삐를 Spring에 넘겨줌으로써 우리는 객체를 생성하고 이를 그가 호출할 메소드에 전달하는 책임도 그에게 넘겼습니다. 질문이 생깁니다: Spring이 어떤 객체(bin)를 생성할지 어떻게 알 수 있습니까?

애플리케이션 구성 방법

애플리케이션을 구성하는 세 가지 주요 방법이 있습니다 (즉, 작업해야 할 객체를 Spring에 알려줍니다):
  1. XML 파일/구성 사용;
  2. Java 구성 사용;
  3. 자동 구성.
Spring 개발자는 이러한 우선순위를 다음과 같이 정렬합니다.
  • 우선순위를 부여해야 하는 가장 우선순위가 높은 방법은 자동 구성입니다.
  • 자동 구성을 사용하는 경우 가능한 모든 Bean을 올바르게 구성하는 것이 불가능할 경우 Java 구성(Java 코드를 사용하여 객체 생성)을 사용하십시오.
  • 우선순위가 가장 낮은 방식은 XML 구성을 사용하는 구식 방식입니다.
게다가 Spring에서는 이러한 메소드를 결합할 수 있습니다. 예를 들어, 자동으로 구성할 수 있는 모든 작업을 Spring에서 수행하도록 하세요. 일부 특수 매개변수를 지정해야 하는 경우 Java 구성을 사용하여 수행하고, 추가로 일부 레거시 구성을 xml 형식으로 연결할 수도 있습니다. 일반적으로 이 모든 작업은 매우 유연하게 수행될 수 있습니다. 하지만 그래도 자동 설정을 사용하여 모든 작업을 수행할 수 있다면 자동 설정을 사용하세요. 저는 자동 구성과 Java 구성만 고려하겠습니다. xml 구성은 이미 인터넷의 거의 모든 Spring 예제에서 사용되며 Java 구성이 어떻게 작동하는지 이해하고 나면 동일한 작업을 수행하는 xml 파일을 "읽는" 데 문제가 없을 것입니다. 자동 구성은 작업에 필요한 객체가 우리가 작성한 클래스의 객체일 때 사용됩니다 . 클래스의 객체를 생성하는 데 매우 특정한 로직이 필요한 경우 또는 자동 구성에서 선택되는 필요한 주석으로 일부 클래스를 표시할 기회가 없는 경우 Java 구성에서 이 작업을 수행할 수 있습니다. . 다음 부분 에서는 Maven 프로젝트를 생성하고 여기에 두 개의 중앙 스프링 모듈을 연결하고 첫 번째 Bean을 생성합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION