CodeGym /Java Blog /무작위의 /게으른 사람들을 위한 Spring 기초, 기본 개념 및 코드 예제. 1 부
John Squirrels
레벨 41
San Francisco

게으른 사람들을 위한 Spring 기초, 기본 개념 및 코드 예제. 1 부

무작위의 그룹에 게시되었습니다
게으른 사람들을 위한 Spring 기초, 기본 개념 및 코드 예제.  파트 1 - 1이 기사에서는 내 코드를 사용하여 5분 안에 작동하는 Spring 프로젝트를 시작하고 실행하는 방법을 설명하지 않을 것입니다. 나는 당신이 모를 수 있고 여전히 프로젝트를 만들 수 있는 기본 사항만 작성하려고 합니다. 그러나이 기사에서는 여전히 무슨 일이 일어나고 있는지, 더 중요한 것은 그 이유를 이해하지 못할 것입니다.

스프링 프레임워크란?

Spring Framework 또는 간단히 Spring은 Java로 웹 애플리케이션을 만드는 데 가장 많이 사용되는 프레임워크 중 하나입니다. 프레임워크는 라이브러리와 비슷하지만(아마도 이 용어에 더 익숙할 것입니다) 고려해야 할 사항이 있습니다. 대략적으로 말하면, 라이브러리를 사용할 때 라이브러리에 포함된 클래스의 인스턴스를 만들고 필요한 메서드를 호출하여 필요한 결과를 얻으면 됩니다. 즉, 이것은 보다 명령적인 접근 방식입니다. 프로그램에서 어떤 개체를 만들어야 하는 특정 순간, 어떤 특정 메서드를 호출해야 하는 시기 등을 명시적으로 지정합니다. 프레임워크에서는 상황이 약간 다릅니다. 자신만의 클래스를 작성하고 그 안에 로직을 작성하면 프레임워크 자체가 클래스의 인스턴스를 생성하고 해당 메서드를 호출합니다. 클래스는 일반적으로 프레임워크에서 일부 인터페이스를 구현하거나 일부 클래스를 상속하므로 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. 따라서 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. 따라서 이미 작성된 일부 기능을 제공합니다. 그러나 항상 그런 것은 아닙니다. 예를 들어, Spring은 그러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 피하기 위해 가능한 한 많이 시도합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. Spring은 이러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 가능한 한 많이 피하려고 합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. Spring은 이러한 긴밀한 결합(클래스가 프레임워크의 클래스/인터페이스에 직접 의존하는 경우)을 가능한 한 많이 피하려고 합니다. 이를 달성하기 위해 주석을 사용합니다. 이에 대해서는 나중에 다시 다루겠습니다. 그러나 Spring은 단지 당신이 사용할 수 있는 클래스와 인터페이스의 모음이라는 것을 이해하는 것이 중요합니다 :) 또한 Spring은 웹 애플리케이션뿐만 아니라 가장 일반적인 콘솔 프로그램에도 사용될 수 있다는 점에 바로 주목하고 싶습니다. 우리 모두에게 너무나 친숙한 것입니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. ) 또한 Spring은 웹 응용 프로그램뿐만 아니라 우리 모두에게 매우 친숙한 가장 일반적인 콘솔 프로그램에도 사용할 수 있다는 점을 바로 주목하고 싶습니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다. ) 또한 Spring은 웹 응용 프로그램뿐만 아니라 우리 모두에게 매우 친숙한 가장 일반적인 콘솔 프로그램에도 사용할 수 있다는 점을 바로 주목하고 싶습니다. 그리고 우리는 오늘 그들 중 하나를 쓸 것입니다.

구조

그러나 Spring은 하나의 특정 프레임워크가 아닙니다. 오히려 그것은 각각 고유한 종류의 작업을 수행하는 여러 개의 작은 프레임워크를 가리키는 데 사용되는 일반적인 이름입니다. 게으른 사람들을 위한 Spring 기초, 기본 개념 및 코드 예제.  파트 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
그림 2.1. 스프링 프레임워크 개요

보시다시피 Spring은 모듈식입니다. 이렇게 하면 응용 프로그램에 필요한 모듈만 연결하고 분명히 사용하지 않을 모듈은 연결하지 않을 수 있습니다. 내가 아는 한, Spring이 당시 경쟁자(EJB)를 능가하고 주도권을 잡을 수 있게 한 것은 바로 이 접근 방식이었습니다. EJB를 사용하는 애플리케이션은 그 뒤에 많은 종속성을 끌어들였고 결과적으로 느리고 느린 것으로 판명되었습니다. 이미지는 Spring Framework가 여러 모듈로 구성되어 있음을 보여줍니다.
  • 데이터 접근
  • 편물
  • 핵심
  • 그리고 더
오늘 우리는 기본 모듈에서 찾을 수 있는 몇 가지 개념인 빈, 컨텍스트 등을 알게 될 것입니다. 짐작하셨겠지만 데이터 액세스 모듈에는 데이터(주로 데이터베이스) 작업을 위한 도구가 포함되어 있고 웹 모듈은 네트워크 작업(나중에 설명할 웹 응용 프로그램 생성 포함)을 위한 것입니다. 또한 Spring을 지원하는 포괄적인 인프라가 있습니다. 프레임워크 자체에 공식적으로 포함되지는 않지만 Spring 프로젝트에 원활하게 통합되는 다른 많은 프로젝트(예를 들어, 제가 다루고자 하는 Spring Security는 웹 사이트에서 사용자 인증).

Java에 Spring Framework가 있는 이유는 무엇입니까?

뭐, 패셔너블하고, 세련되고, 신선하다는 점 외에도 Spring을 사용해서 약간의 스킬이라도 익히는 순간, 없는 일이 얼마나 많은지 알게 될 것이라고 지금 당장 말씀드릴 수 있습니다. 해야 할 일과 Spring이 스스로 수행하는 작업의 양. 수십 줄의 구성 설정을 작성하고 몇 개의 클래스를 작성할 수 있으며 작업 프로젝트로 끝납니다. 그러나 일반 서블릿이나 소켓 및 순수한 Java를 기반으로 동일한 프로젝트를 구현하려는 경우 내부에 얼마나 많은 작업이 있는지, 얼마나 많은 작업이 수행되고 있는지, 그리고 얼마나 많은 코드를 작성해야 하는지 궁금해지기 시작하면 머리카락이 쭈뼛 서게 될 거예요 :) 봄은 일종의 마법이라고도 합니다. 모든 것이 작동하는 것을 볼 때 이것을 경험합니다. 하지만 어떻게 그리고 얼마나 많은 작업이 배후에서 일어나고 있는지에 대한 대략적인 아이디어도 가지고 있습니다. 따라서 실제로 어떤 종류의 마법이 작동하는 것 같습니다 :) 모든 것이 어떻게 상호 연결되어 있는지 설명하는 것보다 마법이라고 부르는 것이 더 쉽습니다. :) Spring 공부에 찬성하는 두 번째 주장은 주니어 개발자를 위한 채용 공고의 약 90%(내 개인적인 관찰에 근거)가 Spring이 무엇인지에 대한 지식이나 적어도 일반적인 아이디어를 필요로 한다는 것입니다.Data, Web MVCSecurity모듈은 정교한 개발자를 제공합니다 :) 그러나 오늘은 기본에 관한 것입니다.

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에 알리는 방법입니다.
  1. XML 구성 파일
  2. Java 기반 구성
  3. 자동 구성
Spring의 작성자는 다음 순서로 우선순위를 지정합니다.
  • 가장 우선적으로 선호되어야 하는 방법은 자동 구성입니다.
  • 자동 구성을 사용하여 가능한 모든 bean을 올바르게 구성할 수 없는 경우 Java 기반 구성(Java 코드를 사용하여 개체 생성 포함)을 사용하십시오.
  • 우선 순위가 가장 낮은 방법은 XML 구성 파일을 사용하는 구식 방법입니다.
Spring은 또한 이러한 메소드를 결합할 수 있게 해줍니다. 예를 들어 Spring이 자동으로 구성할 수 있는 모든 것을 구성하도록 하고, 특별한 매개변수가 필요할 때마다 Java 기반 구성을 사용하고, 레거시 구성에 XML을 사용합니다. 이것은 모두 매우 유연하게 작동합니다. 그래도 모든 것이 자동으로 구성될 수 있다면 해당 옵션을 선택하십시오. 자동 구성과 Java 기반 구성만 고려하겠습니다. XML 구성은 인터넷의 거의 모든 Spring 예제에서 사용됩니다. 또한 Java 기반 구성이 작동하는 방식을 이해하면 동일한 작업을 수행하는 XML 파일을 읽는 데 아무런 문제가 없습니다. 자동 구성은 우리가 작성한 클래스의 개체로 작업해야 할 때 사용됩니다. 개체 중 하나를 만드는 데 매우 구체적인 논리가 필요한 경우 또는 자동 구성에 필요한 주석으로 일부 클래스를 만들 수 없는 경우 Java 기반 구성을 사용하여 필요한 작업을 수행할 수 있습니다. 에서다음 부분 에서는 Maven 프로젝트를 만들고 몇 가지 기본 Spring 모듈을 연결하고 첫 번째 빈을 만듭니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION