spring framework를 계속 사용하다 보니 회의감에 느껴 기존에 미니 프로젝트로 시작하려고 했던
spring boot, security, jpa, mysql(mariadb)를 사용한 웹 개발 프로젝트를 시작하려고 한다.
프로젝트를 시작하기에 앞서, 기본 셋팅을 해보자.
먼저 tool은 sts 4.2.0
java는 open jdk1.8이다.
이번 페이지에서는 security를 제외하고 jpa까지만 진행할 것이다.
자, sts를 실행시킨 후 spring starter project로 프로젝트를 생성해보자.
- name : 프로젝트명
- Type : Gradle -> 필자는 3.x버전 선택
- Packaging : 프로젝트 빌드 타입 -> 필자는 jar로 선택
- Java Version : 8
나머지는 선호하는 형식으로 넣어준 후 Next>
- Spring Boot Version : spring boot 버전 선택 -> 필자는 2.1.5로 선택하였다.
- Frequently Used : 최근 사용했던 dependencies를 표출해준다.
- Available : 사용할 dependencies 선택
-> SQL에서 Spring Data JPA 선택
-> Web에서 Spring Web Starter 선택
Finish를 선택하여 프로젝트 생성을 끝낸다.
다음으로 mariadb와 연결하기 위해 gradle 의존 설정 및 application.properties 설정을 해야한다.
먼저 gradle에 의존을 추가하기 위해 build.gradle을 열어보자.
<build.gradle>
pom.xml에 추가하는 것과 거의 동일하다.
dependencies에 아래의 내용을 추가해주자.
compile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.4.1'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
<application.properties 경로 : src/main/resources/>
(mariadb 서버 만드는 방법은 추후에 필요하면 게시하도록 하겠다.)
기존 mybatis설정하는 것 처럼 url, driverClassName, username, password를 추가해주고
jpa.hibernate.ddl-auto=create를 추가해 준다.(jpa및 datasource관련 설정은 추후에 추가적으로 설명하겠다.)
기본 설정이 끝났다.
이제 class들을 만들어 보자.
먼저, 패키지와 클래스 구성은 다음과 같이 해보았다.
패키지를 구성하는 과정에서, 한가지 문제점이 있었는데 springboot시 자동 생성되는 application.java이
배치되어 있는 패키지(com.example.demo)를 base-package로 잡고, 나머지 패키지를 생성해야 MVC관련
어노테이션들이 인식이 되었다. @componentScan을 사용하여 base package를 변경하려고 시도했으나,
인식이 되지 않았다. (혹시 방법 알고 있으신 분들으 댓글 부탁 바랍니다.)
<Application.java (BootSecurityJpa1Application.java) 소스코드>
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BootSecurityJpa1Application {
public static void main(String[] args) {
SpringApplication.run(BootSecurityJpa1Application.class, args);
}
}
-> 기본으로 생성되는 클래스로 현 페이지에서는 아무런 작업을 하지 않았다.
<MainController.java 소스코드>
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.demo.service.UserService;
import com.example.demo.vo.User;
@Controller // This means that this class is a Controller
public class MainController {
@Autowired
private UserService userService;
@GetMapping(path="/add") // Map ONLY GET Requests
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email) {
// @ResponseBody means the returned String is the response, not a view name
// @RequestParam means it is a parameter from the GET or POST request
User n = new User();
n.setName(name);
n.setEmail(email);
userService.userInsert(n);
return "Saved";
}
@GetMapping(path="/all")
public @ResponseBody Iterable<User> getAllUsers() {
// This returns a JSON or XML with the users
return userService.userSelect();
}
}
-> MainController.java의 소스코드 일부는 spring boot 공식사이트에서 발췌한 부분으로
쿼리를 수행하는 userService 객체를 주입받기 위해 @Autowired를 사용했다.
또한 /add는 사용자를 추가하기위함이고, /all은 추가한 사용자를 확인하기 위한 url이다.
<UserRepository.java 소스코드>
package com.example.demo.repository;
import org.springframework.data.repository.CrudRepository;
import com.example.demo.vo.User;
// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete
public interface UserRepository extends CrudRepository<User, Integer> {
}
->하나의 테이블이라고 생각하면 이해가 쉬울 것 같다. CrudRepository 인터페이스를 상속받으며
제네릭 타입중 첫번째는 테이블의 컬럼이 매핑되어있는 클래스(User.java)를 넣고, 두번째는 User테이블의 기본키 타입을 넣는다.
<UserService.java>
package com.example.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.repository.UserRepository;
import com.example.demo.vo.User;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void userInsert(User user) {
userRepository.save(user);
}
public Iterable<User> userSelect() {
return userRepository.findAll();
}
}
-> UserService.java는 데이터를 컨트롤러에서 받아 받은 데이터로 쿼리를 수행하여 나온 결과를 다시
컨트롤러에 전달해주는 역할을 한다.
UserRepository 객체를 주입받으며, sava()는 Insert쿼리를 수행하고,
findAll()은 select쿼리를 수행한다.
<User.java 소스코드>
package com.example.demo.vo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity // This tells Hibernate to make a table out of this class
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
-> User.java는 하나의 테이블을 의미하며 @Entity 어노테이션을 사용하여 테이블임을 명시하고,
테이블에 해당하는 컬럼들을 변수로 지정하여 Getter, Setter를 구현한다.
또한 @Id 어노테이션을 사용하여 기본키임을 id변수에 명시를 하며, @GeneratedValue(strategy=GenerationType.AUTO)
어노테이션을 사용하여 기본키값을 자동으로 증가하도록 설정하였다.'
자 이제, 제대로 동작하는지 확인해보자.
로컬환경에서 실행하기 위해서는 Run As에서 Spring Boot App를 클릭하자.
(기존 spring 프로젝트 수행시 tomcat에 추가할 필요가 없다.)
<수행 시 화면>
위와 같이 콘솔에 해당 내용들이 출력되었다면, Spring Boot App가 정상적으로 수행된 것이다.
자 이제, 웹 브라우저 또는 HTTP를 호출할 수 있는 tool을 사용하여 사용자를 추가하여 보자.
http://127.0.0.1:8080/add?name=javaboja&email=javaboja@javaboja.com -> 호출!!
Saved가 출력되었다면, 쿼리가 제대로 수행된 것이다.
이제, 추가된 사용자를 출력하여 보자.
http://127.0.0.1:8080/all -> 호출!!
추가된 사용자가 제대로 출력되는 것을 확인할 수 있다.
Spring Boot, JPA, Mysql 기본 셋팅이 끝났다.
'spring boot' 카테고리의 다른 글
spring boot에 HTTP2 방식을 적용해보자. (0) | 2019.11.04 |
---|---|
Could not run build action using Gradle distribution 에러 (2) | 2019.06.20 |
lombok을 활용하여 보자 (0) | 2019.06.19 |