JavaRush /Java Blog /Random-KO /Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(1부)...
Макс
레벨 41

Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(1부)

Random-KO 그룹에 게시되었습니다
좋은 오후에요. 이 기사에서는 간단한 CRUD 애플리케이션을 생성하는 과정에서 Maven, Spring, Hibernate, MySQL 및 Tomcat과 같은 것들을 처음 접한 내용을 공유하고 싶습니다. 이것은 4의 첫 번째 부분입니다. 이 기사는 주로 여기에서 이미 30-40 레벨을 완료했지만 아직 순수 Java를 넘어서는 모험을 하지 않고 오픈 월드에 들어가기 시작하는(또는 곧 시작하려는) 사람들을 위한 것입니다. 이 모든 기술, 프레임워크 및 기타 생소한 단어입니다. Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(1부) - 1

콘텐츠:

소개

나는 그것이 사용된 다양한 예를 연구함으로써 나에게 새로운 기술과 프레임워크에 익숙해지기 시작했습니다. 왜냐하면 일반적으로 본격적인 응용 프로그램의 예를 사용하여 실제로 작동하는 것을 볼 때 가장 잘 이해하기 때문입니다. 일반적으로 이러한 예는 CRUD 애플리케이션( Create , Read , Update , Delete )이며, 인터넷은 다양한 정도의 복잡성을 지닌 이러한 예로 가득 차 있습니다. 문제는 일반적으로 그곳에서 어떻게, 무엇을, 왜 수행되었는지, 왜 그러한 종속성이 추가되었는지, 왜 그러한 클래스가 필요한지 등에 대해 자세히 설명하지 않는다는 것입니다. 대부분의 경우 그들은 최종 POM 파일과 클래스의 최종 버전을 포함하여 완전히 완성된 애플리케이션을 가져와 숙련된 사람에게 분명해 보일 수 있는 작은 사항에 초점을 맞추지 않고 단순히 각 애플리케이션을 실행합니다. 나는 그러한 예를 많이 보았고 일반적으로 모든 것이 어떻게 작동하는지 명확하지만 어떻게 이런 결과가 나오는지는 완전히 명확하지 않습니다. 따라서 경험이 풍부한 개발자의 입장에서가 아니라 Spring, Hibernate 등을 다루어본 적이 없는 초보자의 입장에서 이러한 예제가 유용할 것이라고 판단했습니다.
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 2
가장 간단한 Hello World 수준부터 시작하여 CRUD 애플리케이션을 만드는 전체 경로를 가능한 한 자세히 설명하려고 노력할 것입니다. 우선, 나는 이것을 나 자신을 위해 합니다. 왜냐하면 당신이 무언가를 설명하고, 말하고, 설명하려고 할 때 그것이 머리 속에 훨씬 더 잘 흡수되고 정리되기 때문입니다. 그러나 이것이 누군가에게 유용하고 그들이 무엇인가를 알아내는 데 도움이 된다면 나는 매우 기쁠 것입니다. 이 예에서는 Maven , Tomcat , Spring , HibernateMySQL을 사용하여 간단한 CRUD 애플리케이션을 만들어 보겠습니다 . Maven , MySQL 설치 , Ultimate 버전 아이디어 사용 등의 예비 단계 자세히 설명할 필요는 없을 거라 생각하는데, 이 부분은 문제가 없을 것 같습니다. 이 예에서는 xml을 사용하지 않고 Java 클래스(JavaConfig라고 함)를 사용하여 구성이 구성된다는 점에 주목할 필요가 있습니다.

프로젝트 만들기

그래서 저는 초보자이기 때문에 모호한 전형은 사용하지 않을 것입니다. Spring 초기화는 여전히 너무 무서운 것 같습니다. 따라서 가장 일반적인 간단한 Maven 프로젝트를 생성하겠습니다. 도메인 이름이 없으므로 groupid에는 이라고 쓰고 testgroup, Artifactid에는 이름을 씁니다 filmography(예: 영화 목록이 됨). 우리는 프로젝트를 만들고 Enable auto-import아이디어가 제안되면 선택합니다. 덕분에 POM 파일(Project Object Model, 이 파일은 Maven 프로젝트의 전체 구조를 설명함)을 변경할 때마다 모든 것이 자동으로 프로젝트에 즉시 적용됩니다. 라이브러리가 이미 있는 경우 로컬 저장소에서 라이브러리를 가져오거나 이전에 처리하지 않은 새로운 종속성을 사용하는 경우 Maven은 인터넷을 통해 중앙 저장소에서 라이브러리를 다운로드하기만 하면 됩니다. Maven에는 소스 및 문서(소스 및/또는 문서 다운로드)를 다운로드하는 기능도 있습니다. 또한 매우 편리합니다. 일부 클래스나 메소드에서 뭔가 명확하지 않은 경우 소스 코드로 이동하여 내부에서 모든 것이 어떻게 작동하는지 확인할 수 있습니다. 몇 가지 세부 사항을 추가해 보겠습니다. 이것은 웹 애플리케이션이 될 것이며 우리는 Tomcat을 사용할 것입니다 . Tomcat에 애플리케이션을 배포하려면 이를 war 아카이브(웹 애플리케이션 리소스, 웹 애플리케이션을 위한 특수 형식) 형식으로 전송해야 합니다. 이렇게 하려면 애플리케이션이 war 아카이브로 컴파일되도록 POM 파일에 다음 줄을 추가하세요.
<packaging>war</packaging>
글쎄, 당신은 또한 웹 소스를 위한 특별한 디렉토리가 필요할 것입니다. 우리의 경우에는 jsp 페이지와 일부 웹 리소스가 있을 것입니다 . main디렉터리를 만들어 보겠습니다 webapp. 이는 표준 Maven 디렉토리 구조이기 때문에 정확하게 호출되어야 하며 와 정확히 main같은 방식 으로 위치해야 합니다. 패키지를 설치하고 이것이 웹 프로젝트라고 판단되면 디렉토리는 자동으로 웹 애플리케이션 소스로 표시되고(파란색 점이 표시됨) 웹과 관련된 모든 것이 이 폴더에서 검색됩니다. 그리고 잠시만요. 기본적으로 Maven은 언어 버전 1.5를 사용하지만 예를 들어 버전 1.8 - Java 8을 사용하고 싶습니다. (10 또는 11을 사용할 수 있지만 여전히 거기에서 기능을 사용할 계획이 없으므로 8로 둡니다. ). 이 문제는 매우 간단하게 해결할 수 있습니다. Google에 "Maven java 8"과 같은 내용을 작성하고 Maven이 필요한 버전에 맞게 클래스를 컴파일할 수 있도록 POM 파일에 무엇을 추가해야 하는지 확인합니다. 결과적으로 우리는 다음과 같은 결과를 얻었습니다. javaresourceswarwebappЗнакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 3

스프링 MVC 연결

어딘가에서 시작해야합니다. 계획에 따르면 데이터베이스를 연결하고 Hibernate를 사용할 예정이지만 지금으로서는 이 모든 것이 조금 무섭게 들립니다. 먼저 더 간단한 일을 해야 합니다. Spring MVC는 이미 더 좋습니다. 우리는 오랫동안 MVC 패턴에 익숙했으며 이 과정의 대규모 작업 중 절반에 사용되었습니다. 여기서부터 춤을 추기 시작하겠습니다. Spring MVC로 웹 애플리케이션을 생성하려면 Servlet-API도 필요합니다. 요청-응답 상호 작용이 발생하는 데 사용되는 것입니다. 이것을 연결해 보도록 하겠습니다. Google로 이동하여 Maven 저장소 에서 필요한 종속성을 찾아 pom.xml. 외부 라이브러리 섹션에서 spring-webmvc가 로드되었을 뿐만 아니라 다른 많은 것들도 Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 4볼 수 있습니다 . 저것들. spring core , context , beans 등에 대한 종속성을 추가로 포함할 필요가 없습니다. 우리에게 필요한 모든 것은 spring-webmvc 와 함께 가져왔습니다 .

우리는 작은 면책 조항을 만들어야 합니다. 이미 추가된 라이브러리와 함께 번들로 제공되어 있더라도 일반적으로 사용되는 각 라이브러리에 대해 별도로 종속성을 추가하는 것이 좋습니다. 이는 일부 문제와 결함을 피하는 데 도움이 될 수 있습니다.

간단한 예입니다. 일부 API를 사용하는 종속성을 추가하고 동시에 이 API에 대한 일종의 구현을 불러온다고 가정해 보겠습니다. 그런 다음 동일한 API를 사용하고 이에 대한 일부 구현을 가져오는 또 다른 종속성을 추가했지만 이번에는 다릅니다. 따라서 동일한 API에 대해 두 가지 다른 구현이 있습니다. 그리고 우리가 이 API의 일부 메소드를 어딘가에서 사용하고 싶다면 시스템이 어떤 구현을 사용할지 알지 못하고 아마도 우리가 예상한 구현이 아닌 무작위로 선택하기 때문에 문제가 발생할 것입니다. 그리고 구현 중 하나에 대한 종속성을 명시적으로 지정하면 해당 구현에 우선순위가 부여됩니다.

그러나 이는 그렇게 엄격한 권장 사항은 아니며 주로 여러 회사의 다양한 라이브러리가 사용되는 대규모 프로젝트에 적용됩니다. POM 파일을 너무 많이 로드하지 않기 위해 여기서는 그렇게 하지 않을 것입니다. 문제가 없을 것으로 예상됩니다. 그러나 그럼에도 불구하고 이 점을 명심할 가치가 있습니다.

메모 하나 더. provided의존하다은 무슨 뜻인가요 javax.servlet-api? 범위 는 종속성의 범위입니다. provided즉, 애플리케이션을 컴파일하고 테스트하는 단계에서 종속성을 사용할 수 있지만 보관되지는 않습니다. 사실 애플리케이션을 배포하기 위해 우리는 서블릿 컨테이너인 Tomcat을 사용할 것이며 내부에 이미 그러한 라이브러리가 있으므로 이를 그곳으로 전송하고 불필요한 로드로 아카이브에 부담을 줄 필요가 없습니다. 앞으로는 같은 이유로 일반적인 방법을 사용하지 않고 수행할 것입니다 main. Tomcat 내부에 이미 존재하기 때문입니다.

페이지 및 컨트롤러 만들기

이제 간단한 요리를 만들어 봅시다. 먼저 뷰가 저장될 webapp추가 디렉토리(예 : pagesjsp 페이지를 만들고 두 개의 페이지를 만듭니다. 예를 들어, 앞으로 영화 목록이 표시될 페이지가 필요하며 films.jsp아마도 편집을 위해 별도의 페이지를 만들 수 있습니다 editPage.jsp. 지금은 심각한 내용으로 채우지 않고 단지 테스트를 위해 한 페이지에서 다른 페이지로 연결되는 링크를 만들 것입니다. 이제 요청을 처리할 클래스가 필요합니다. 제어 장치. 새 패키지를 추가 controller하고 그 안에 클래스를 생성해 보겠습니다 FilmController(일반적으로 모든 것을 다른 패키지에 패키지할 필요는 없습니다. 이 애플리케이션은 매우 작고 간단하지만 일반 프로젝트에는 많은 컨트롤러, 구성 클래스, 모델이 있을 수 있습니다) 등이 있으므로 작은 프로젝트부터 시작하더라도 혼란이 없도록 모든 작업을 질서 있고 체계적으로 수행하는 데 즉시 익숙해지는 것이 좋습니다. 이 클래스에서는 요청에 대한 응답으로 뷰를 반환하는 메서드를 만듭니다.
package testgroup.filmography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FilmController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        return modelAndView;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
}
점은 무엇인가? Spring MVC에는 DispatcherServlet. 이것은 메인 컨트롤러와 같습니다. 들어오는 모든 요청은 이를 통과한 다음 특정 컨트롤러로 전달됩니다. 주석은 @ControllerSpring MVC에게 이 클래스가 컨트롤러(일반적으로 논리적임)임을 알려주고 디스패처는 주석을 확인하여 @RequestMapping적절한 메서드를 호출합니다. 주석을 사용 @RequestMapping하면 클라이언트(브라우저)에서 사용할 수 있는 컨트롤러 메서드의 주소를 지정할 수 있습니다. 또한 컨트롤러 클래스에 적용하여 모든 메서드의 루트 주소를 설정할 수도 있습니다. 메소드의 매개 allFilms()변수는 value" "로 설정되므로 http://host:port// 조합이 브라우저에 입력되면 즉시 호출됩니다 (예: 기본적으로 http://localhost:8080/ 또는 http 입니다 ). ://127.0 .0.1:8080/ ). 매개변수는 지원되는 요청 유형(GET, POST, PUT 등)을 지정합니다. 여기서는 데이터만 수신하므로 GET이 사용됩니다. 나중에 추가 및 편집 방법이 나타나면 이미 POST 요청이 있을 것입니다. (단, 메소드를 나타내는 Annotation 대신에 Annotation 등 을 동등하게 사용할 수 있습니다 .) 우리의 메소드에서는 객체를 생성 하고 반환되어야 하는 뷰의 이름을 설정합니다. method@RequestMapping@GetMapping@PostMapping@GetMapping@RequestMapping(method = RequestMethod.GETModelAndView

구성

구성 설정으로 넘어 갑시다. 패키지에 config클래스를 만들어 보겠습니다 WebConfig. 유형의 객체를 반환하는 메소드는 단 하나뿐입니다 ViewResolver. 이는 이름으로 표현을 찾는 데 필요한 인터페이스입니다.
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
@Configuration이 클래스는 구성 클래스이고 bean구성 요소의 정의와 종속성을 포함하고 있음을 Spring에 알려줍니다. Bean은 Spring에서 관리하는 객체입니다. 주석은 Bean을 정의하는 데 사용됩니다 @Bean. @EnableWebMvc에서 Spring MVC 구성을 가져올 수 있습니다 WebMvcConfigurationSupport. WebMvcConfigurer예를 들어, 다양한 메소드가 포함된 인터페이스를 구현하고 모든 것을 원하는 대로 사용자 정의할 수도 있지만 아직은 그럴 필요가 없으며 표준 설정으로 충분합니다. @ComponentScanSpring이 관리해야 하는 구성 요소를 찾을 위치를 알려줍니다. 주석 @Component또는 그 파생어(예 @Controller: , @Repository, ) 로 표시된 클래스입니다 @Service. 이러한 주석은 자동으로 클래스 Bean을 정의합니다. 이 방법에서 viewResolver()우리는 구현을 생성하고 에서 표현을 정확히 찾을 위치를 결정합니다 webapp. 따라서 컨트롤러 메서드에서 이름을 " films"로 설정하면 뷰는 " "로 표시됩니다 /pages/films.jsp. 따라서 구성 클래스가 있지만 지금은 일종의 별도 클래스이므로 애플리케이션에 어떤 영향도 주지 않습니다. . 이 구성을 Spring 컨텍스트에 등록해야 합니다. 이를 위해서는 수업이 필요합니다 AbstractAnnotationConfigDispatcherServletInitializer. 패키지에서는 AppInitializer라는config 후속 항목을 만들고 해당 메서드를 구현합니다.
package testgroup.filmography.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
마지막 방법은 주소를 등록하는 방법이며 구성 클래스를 등록하는 방법이 2가지 더 있습니다. ViewResolver등이 정의된 웹 구성은 에 배치됩니다 getServletConfigClasses(). 문서와 다양한 가이드에서 이 모든 내용을 읽는 것이 더 좋지만 우리의 경우 아직 자세히 알아볼 필요는 없습니다. 원칙적으로 우리는 두 가지 모두에서 WebConfig정의할 수 있으며 RootClasses두 가지를 동시에 정의할 수도 있지만 여전히 작동합니다. . 하나 더. 양식에서 러시아어 문자가 포함된 값을 보낼 때 결과가 낙서로 나타나는 경우 인코딩에 문제가 있을 수 있습니다. 이 문제를 해결하기 위해 요청을 사전 처리하는 필터를 추가하겠습니다. AppInitializer 클래스 로 이동하여 원하는 인코딩을 나타내는 메서드를 재정의합니다 getServletFilters. 물론 페이지와 데이터베이스에서와 같이 다른 모든 곳과 동일해야 합니다.
protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }
글쎄, 모든 것이 설정된 것 같습니다. 실행하여 무슨 일이 일어나는지 확인할 수 있습니다. 실행 -> 실행 -> 구성 편집 -> 새 구성 추가 -> Tomcat 서버 -> 로컬 다음으로 배포할 아티팩트를 선택해야 합니다. 아이디어 자체에서 힌트를 얻을 수 있습니다 . Warning: No Artifacts Marked for Deployment . 수정 버튼을 클릭 하고 ...: warexplored 를 선택하세요 . 또는 배포 -> 추가 -> 아티팩트 -> ...: 전쟁 폭발 로 이동할 수 있습니다 . Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 5또한 배포 로 이동하여 Applecation 컨텍스트 필드 (이는 브라우저에서 애플리케이션을 사용할 수 있는 URL 주소의 일부임)를 " "로 설정 해야 합니다 /. 그런 다음 우리 애플리케이션을 http://localhost:8080/Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 6 에서 즉시 사용할 수 있습니다 (그러나 거기에 " "와 같은 항목을 지정할 수도 있습니다 . 그런 다음 이를 모든 주소에 추가하기만 하면 됩니다. 예를 들어 " http://localhost:8080/edit" 이지만 "http://localhost:8080/filmography/edit" ) 가 됩니다 . 실행을 클릭 하고 시작될 때까지 기다립니다. 내가 얻은 정보는 다음과 같습니다. 모든 것이 괜찮은 것 같지만 한 가지 주의 사항이 있습니다. 사실 우리 페이지는 이제 공개적으로 액세스할 수 있으며 주소 표시줄에 경로를 작성하여 직접 액세스할 수 있습니다. http://localhost:8080/pages/films.jsp를 입력하면 이제 컨트롤러가 알지 못하는 사이에 페이지가 수신됩니다. 어쨌든 이것은 정확하지 않으므로 특별한 디렉토리를 생성하겠습니다 . 내부 내용은 공개되지 않으며 컨트롤러를 통해서만 접근할 수 있습니다. 뷰( ) 가 있는 디렉토리를 에 배치 하고 그에 따라 접두사에 추가합니다. /filmographyЗнакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 7webappWEB-INFpagesWEB-INFViewResolver
viewResolver.setPrefix("/WEB-INF/pages/");
이제 우리는 http://localhost:8080 페이지를 얻었 지만 http://localhost:8080/WEB-INF/pages/films.jsp 에 직접 접속하려고 하면 404 오류가 발생합니다. 가장 간단한 웹 애플리케이션인 Hello World를 말합니다. 현재 프로젝트 구조는 다음과 같습니다.
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 8

모델

이미 뷰와 컨트롤러가 있지만 MVC에는 세 번째 문자도 있으므로 그림을 완성하기 위해 모델도 추가합니다. 패키지에서 예를 들어 , ( 제목), (출시 연도), (장르) 및 (예: 이 영화를 이미 보셨나요?) 필드가 포함된 model클래스를 만들어 보겠습니다 .Filmint idString titleint yearString genreboolean watched
package testgroup.filmography.model;

public class Film {
    private int id;
    private String title;
    private int year;
    private String genre;
    private boolean watched;
// + Getters and setters
}
특별한 것은 없고 그냥 일반 클래스, 전용 필드, getter 및 setter입니다. POJO이러한 클래스의 객체는 (Plain Old Java Object) 라고도 합니다 . "간단한 자바 객체". 이제 그러한 객체를 생성하고 페이지에 표시해 보겠습니다. 지금은 어떻게 생성하고 초기화하는지에 대해 너무 걱정하지 않겠습니다. 시험해 보려면 다음과 같이 컨트롤러에서 직접 어리석게 만들어 보겠습니다.
public class FilmController {
    private static Film film;

    static {
        film = new Film();
        film.setTitle("Inception");
        film.setYear(2010);
        film.setGenre("sci-fi");
        film.setWatched(true);
    }
그리고 ModelAndView다음 메소드를 사용하여 이 객체를 우리 객체에 추가합니다 addObject.
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
이제 이 개체를 페이지에 표시할 수 있습니다. films.jspHello World 대신에 속성 ${film}이름 " film"에 해당하는 객체가 여기에 대체됩니다. 이를 실행하고 무슨 일이 일어났는지 살펴보겠습니다(객체의 명확한 출력을 위해 클래스가 Film재정의되었습니다 toString()).
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 9

모델-뷰-컨트롤러

이 단계에서 우리는 이미 완전한 Spring MVC 애플리케이션을 갖춘 것으로 보입니다. 계속 진행하기 전에 모든 것을 다시 살펴보고 모든 것이 어떻게 작동하는지 파악하는 것이 좋습니다. 인터넷에서 이에 대한 많은 사진과 다이어그램을 찾을 수 있습니다. 저는 이것이 마음에 듭니다.
Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 1) - 10
브라우저 라인에 요청을 작성하면 수락됩니다 Dispatcher Servlet. 그런 다음 이 요청을 처리하기에 적합한 컨트롤러를 찾습니다 HandlerMapping(이것은 컨트롤러 선택을 위한 인터페이스이며 사용 가능한 컨트롤러 중 해당 주소를 수락하는 메서드가 있는지 확인합니다). , 적절한 메소드를 호출하고 Controller뷰에 대한 정보를 반환한 다음 디스패처는 ViewResolver'a를 사용하여 이름으로 원하는 뷰를 찾은 후 모델 데이터가 이 뷰로 전송되고 페이지를 출력으로 얻습니다. 이 같은. 계속하려면... Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(1부) Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(2부) Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개 첫 번째 CRUD 애플리케이션(3부) Maven, Spring, MySQL, Hibernate 및 첫 번째 CRUD 애플리케이션 소개(4부)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION