두치넙치
294
2020-04-17 19:01:51
8
474

JPA 데이터베이스 조회


안녕하세요.

스프링부트로 JPA 연동하여 DB값을 조회하고 싶은데 404가 자꾸떠서 이유를 모르겠습니다.

아래 사진 파일 첨부합니다.

1.컨트롤러


컨트롤러에서 서비스를 호출합니다.


2.서비스클래스

서비스 클래스에서는 메소드 정의만 해놓고 이 서비스를 상속받는 하위 구현체에서 로직을 정의하였습니다.


3. 서비스 구현체

해당 서비스를 구현받은 서비스구현체입니다. 이곳에서 레퍼지토리 findAll()메서드를 호출해서 리턴하도록 하였습니다. 


4. 레퍼지토리


4. 엔터티클래스 입니다.


5. DB


6. 프로젝트 구조


7. PostMan 사용 후 에러




제가 의도한 바를 정리하면 이런것입니다.

컨트롤러(매핑) -> 서비스 -> 서비스구현체 -> 레퍼지토리 -> 결과가 빈즈에 담기고 -> 컨트롤러에 리턴 -> 컨트롤러가 결과 표시


어느 단계에서 오류가 있을까요?

소중한 답변 기다리겠습니다.

0
  • 답변 8

  • 봄꾸
    1k
    2020-04-17 21:04:26

    404에러가 왜 뜨는지 찾아보시면 될 것 같네요

    데이터베이스 조회까지 가기도 전에 컨트롤러 매핑이 안되있네요

  • 두치넙치
    294
    2020-04-17 21:45:43 작성 2020-04-17 22:01:10 수정됨

    @봄꾸 

    답변감사합니다.

    혹시 Getmapping이라고 매핑한건데 저게 잘못됬나요..

    이클립스 콘솔창에 아무 에러도 뜨지 않습니다..

  • 제타건담
    6k
    2020-04-17 22:05:24

    혹시 사용하고 있는 라이브러리중에 spring data rest 가 있으신가요? 그게 있으시면 그걸 빼보세요..

  • John Suhr
    3k
    2020-04-18 00:32:09

    패키지의 상태가..?? @SpringBootApplication에 별다른 scanBasePackages가 없으면 컨트롤러는 스캔 안되는 구조네요

  • 두치넙치
    294
    2020-04-18 23:38:04

    @John Suhr 

    답변 감사합니다. 혹시 무슨 말씀을 하시는지 여쭤봐도 될까요?

  • John Suhr
    3k
    2020-04-19 00:09:28 작성 2020-04-19 00:13:47 수정됨

    두치넙치 

    ExampleApplication.java가 @SpringBootApplication 어노테이션이 있는 엔트리 클래스라면,

    src
     ├ main
     │  ├ java
     │  │  └ com
     │  │     └ spring
     │  │        ├ example
     │  │        │   └ ExampleApplication.java
     │  │        ├ service
     │  │        │   └ ExampleService.java
     │  │        └ controller
     │  │            └ ExampleController.java
     │  └ resources
     └ test
    
    @SpringBootApplication
    public class ExampleApplication {
        public static void main(String[] args) {
            SpringApplication.run(ExampleApplication.class);
        }
    }


    와 같은 구성입니다. @SpringBootApplication 안에는 @ComponentScan이 있어서 프로젝트의 Stereotype 애노테이션(@Controller, @Service, ...)을 가진 클래스를 스캔해서 애플리케이션 컨텍스트에 넣습니다.

    단, 기본 스캔 범위는 해당 패키지 내로 한정됩니다. 위의 구조라면 com.spring.example 안의 클래스만 스캔 대상에 포함됩니다 따라서 한 단계 위의 패키지 계층으로 확대해야 컨트롤러와 서비스를 스캔할 수 있습니다.

    @SpringBootApplication(scanBasePackages = { "com.spring" })
    public class ExampleApplication {
        public static void main(String[] args) {
            SpringApplication.run(ExampleApplication.class);
        }
    }

    이 되어야 ExampleController, ExampleService 모두 스캔 대상에 포함될 수 있겠죠. 작성자님이 만드신 패키지 구조는 com.bean, com.bpsolution, com.test, com.example 과 같이 경로가 제각각입니다.

    온전히 모두 스캔하려면 이렇게 해야겠네요

    @SpringBootApplication(scanBasePackages = {
        "com.beans",
        "com.bpsolution",
        "com.test",
        "com.example"
    })
    public class ExampleApplication {
        public static void main(String[] args) {
            SpringApplication.run(ExampleApplication.class);
        }
    }

    스프링 부트는 쓰기 편하게 잘 만들어졌으나, 설정 자동화가 좋은 거라고는 생각하지 않습니다. 결국 under the hood를 공부해야 잘 쓸 수 있으니까요...

  • javaing
    2k
    2020-04-20 00:59:24

    위 설명들을 쉽게 요약하면 ExampleApplication이 가장 상위 패키지에 위치해야 서비스와 컨트롤러를 사용할 수 있다입니다.

  • 두치넙치
    294
    2020-04-22 21:51:57

    답변달아주신 모든분들께 감사합니다.

    덕분에 잘 해결했습니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.