JAVA/Spring Boot

[ Spring boot ] - intellij IDEA + gradle + jpa 프로젝트 생성하기(feat. rest api)

algml0703 2022. 11. 19. 03:04
반응형

 gardle + jpa를 활용한 프로젝트 생성 방법

 

기본 설정

아래와 같은 preferences를 클릭한다.

gradle을 검색하여 아래와 같은 화면을 찾으면 가운데에 Build and run using 과 Run tests using부분을 Gradle에서 Intellij IDEA로 변경해준다.

 

프로젝트 생성

intellij IDEA를 열고, 프로젝트 명, 저장 위치, gradle, 설치된 jdk와 자바 버전을 선택해주고 next를 클릭한다. 이후 프로젝트 생성시 함께 추가할 라이브러리를 설정하는데 기본적으로는, spring web / lombok / mysql driver / spring data jpa 를 추가하여 준다. 

- spring web
: 내장된 톰캣을 제공하고, 웹개발을 위한 기본적이고 다양한 기능을 제공하여 주는 라이브러리이다. 
- lombok
: 코드 작성을 편리하게 해주는 어노테이션을 사용할 수 있도록 해주는 라이브러리이다.  
- mysql driver
: mysql 데이터베이스와 연결을 도와주는 라이브러이다. 사용하는 데이터베이스에 따라 설정한다.
- spring data jpa
: jpa란 java persistence API를 의미하는 것으로, orm을 활용하여 편리하게 데이터베이스 작동을 할 수 있도록 도와주는 라이브러리이다.

위와 같이 추가한 후 프로젝트를 생성하면 아래와 같은 폴더 구조의 프로젝트가 생성된다.

 

데이터베이스 설정

데이터 베이스 사용을 위한 설정은 src/main/resources 하위의 파일을 통해서 할 수 있다.  application이라는 파일명으로 작성하면 되며, 확장자는 properties또는 yml을 사용할 수 있다. 나의 경우 yml파일을 사용하기 위해 기존의 application.properties파일을 application.yml파일로 변경하였다. 파일명 변경은 해당 파일 선택 후 - 우클릭 - refactor- rename을 클릭하여 변경한다.  application.yml파일에 아래와 같이 작성하여 준다.

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/board

yml대신에 .properties형식을 사용하여 작성하는 경우 아래와 같이 작성하여 준다.

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

 

컨트롤러 생성

src/main/java/com/example/boardmysql폴더의 하위에 controller 폴더를 만든 후에 그 안에 BoardController 파일 생성 후 아래와 같이 작성한다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/board")
public class BoardController {

    @GetMapping("/hello")
    public String main() {
        return "hello world";
    }
    
    @PostMapping("/")
    public String boardMake(@RequestBoard String title, String contents) {
    	System.out.println(title() +", "+contents());
        return ''
    }
}

@Controller : 해당 클래스가 컨트롤러임을 알리는 어노테이션이다.
@RequestMapping("")  : 기본 경로를 설정하여 줄 수 있다. 인자롤 준 값을 기본 경로로 설정하여 준다.
@GetMapping("") :  get 메서드에 대한 요청을 처리하는 컨트롤러임을 알리는 어노테이션이다.
@PostMapping("") : post 메서드에 대한 요청을 처리하는 컨트롤러임을 알리는 어노테이션이다.
@RequestBody : body값을 처리할 수 있도록 도와주는 어노테이션이다.

 

데이터베이스 관련

1. controller폴더와 같은 경로 entity 폴더 생성 후 해당 폴더 내부에 Board entity 파일을 만들어 아래와 같이 작성하여 준다. 

@Entity
@Getter
@Setter
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    private String contents;

}

@Entity: 클래스 위에 붙여주며, 해당 클래스가 테이블 구조를 의미힌다는 것을 뜻한다.
@Id: 해당 속성이 고유한 id임을 알리는 역할을 한다.
@GeneratedValue :  기본값을 설정해줄 수 있다. strategy는 어떤 값을 기본값으로 넣을지를 설정하는 것이다.

기존에 컨트롤러에서 body값으로 받던 부분을 entity를 활용하여 title, contents를 Board 엔티티로 받도록 아래와 같이 변경할 수 있다.

@Controller
@RequestMapping("/board")
public class BoardController {

    @GetMapping("/hello")
    @ResponseBody
    public String main() {
        return "hello world";
    }

    @PostMapping("")
    public void registerBoard(@RequestBody Board board) {
        System.out.println(board.getTitle() +", "+board.getContents());
    }
}

위와 같이 작성시 주의해야할 점은 entity클래스에 @Getter와 @Setter 어노테이션을 사용하거나, 직접 getter와 setter메서드를 생성해주어야 한다.

@Getter / @Setter : getter와 setter메서드를 만들어준다.

2. repository 폴더 생성 후 interface 파일을 생성하여 준다.

* interface는 실제 구현된 내용을 숨겨주고, 추후에 데이터 베이스의 변경이 있다고 하더라도 다른 부분에 영향을 최소화하기 위해 인터페이스를 사용하여 구현한다.

import com.example.boardmysql.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> {
    //
}

extends한 JpaRepository<>에는 인자 2개가 들어가는데, 첫번째에는 테이블 엔티티 클래스를 넣어주고, 두번째 인자로는 해당 엔티티 클래스 id의 타입을 넣어준다.

3. service 폴더 생성 후 해당 폴더 안에 BoardService 파일을 생성하여 준 후 아래와 같이 작성하여 준다.

@Service
public class BoardService {

    @Autowired
    private BoardRepository boardRepository;
    // @Autowired를 통해 아래와 같이 의존성을 주입해주는 부분을 대신하여 준다.
    //private BoardRepository boardRepository = nesw BoardRepository;

    public void write(Board board) {
        this.boardRepository.save(board);
    }
}

* controller 폴더 : 말 그대로 경로와 메서드에 따른 부분을 작성하는 파일을 담는 폴더이다.
* entity 폴더 : 테이블 엔티티 파일과 관련한 파일을 담는 폴더이다.
* repository : 엔티티 파일들을 기반으로 하여 repository 를 연결하는 부분이다.
* service : 실제 로직적인 코드가 작성되는 부분이다.
~ 컨트롤러 폴더안의 파일에서 service폴더의 파일을 호출하여 사용하고, service 폴더 안의 파일은 컨트롤러 파일 부분에서 사용된다.

4. 이후 다시 컨트롤러 폴더의 파일로 돌아와서 boardService 클래스를 사용하여 board를 저장하도록 아래와 같이 작성하여 준다.

@RestController
@RequestMapping("/board")
public class BoardController {

    @Autowired
    private BoardService boardService;

    @GetMapping("/hello")
    @ResponseBody
    public String main() {
        return "hello world";
    }

    @PostMapping("/register")
    public void registerBoard(@RequestBody Board board) {
        System.out.println(board.getTitle() +", "+board.getContents());
        this.boardService.write(board);
    }
}

정리
컨트롤러 파일에서 서비스 로직 파일을 호출하고, 서비스로직파일에서는 레포지토리 인터페이스를 사용하여 데이터베이스에 데이터를 입력한다.

참고로 실행은 src/main/java/com/example/boardmysql 폴더의 BoardMysqlApplication에서 초록색 세모 화살표를 누르고 run 클릭한다.

 


mongodb로 세팅하는 경우

- 새로운 프로젝트 생성 후 build.gradle에 아래를 추가하여 준다.

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

- application.yml파일도 아래와 같이 작성하여 준다.

spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 27017
      username: admin
      password: admin
      database: basic

1. 기본적으로 아래와 같이 controller, entity, repository, service 폴더를 생성하여 준다.

[ entity 폴더의 User 파일 ]

[ repository폴더의 UserRepository파일 ]

[ service폴더의 UserSerivice 파일 ]

[ controller폴더의 UserController 파일 ]

 

 

 

 

 

 


에러 관련

위와 같은 에러는 데이터 베이스에 대한 설정이 되어 있지 않거나, 설정 정보가 맞지 않는 경우 발생하는 에러이다. 이때에는 resources폴어 하위의 application 파일에 데이터베이스 설정에 대한 내용을 추가하여 주면 된다.


org.thymeleaf.exceptions.TemplateInputException: Error resolving template [board/register], template might not exist or might not be accessible by any of the configured Template Resolvers

위의 에러는 해당 컨트롤러를 일반 @Controller 어노테이션으로 선언해 준 후 api 요청시 나타나는 에러이다. @Controller는 정적 페이지를 불러오는 방식에서 사용된다. 해당 어노테이션을 @RestController로 변경하여 데이터 처리 중심의 api 기능을 처리하도록 해주면 된다.


스프링 부트 mongodb 설정 에러 

Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "Authenticatio....

mongodb 계정을 삭제 후 아예 새로 만들어서 해봐도 계속 에러가 발생했는데 application.yml파일에 아래와 같은 설정을 추가해주었더니 문제없이 데이터베이스 접속이 가능해졌다.

authentication-database: admin

 


Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported]

api가 json데이터를 받을 수 있도록 headers에 필요한 content-type : application/json설정이 빠져서 발생한 에러이다.

요청시 Content-type : application/json 설정을 추가 후 요청하여 주면 해결된다.

 

 

 

출처

https://stackoverflow.com/questions/50395010/spring-postman-content-type-application-octet-stream-not-supported

https://www.youtube.com/watch?v=YFoTFJQ3pZo&list=PLDMPhWe3CfpY9idK7tGd8QKr36KBID58P&index=16 

반응형