• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

[스프링 컨테이너 사용] 강의 중 getBean IDE 상 에러가 뜨는데 원래 그럴까요 ?

23.02.02 20:08 작성 23.02.02 20:09 수정 조회수 328

0

cannot acess 에러가 발생하는데,

실제, 코드를 돌리면 컴파일 및 런타임 에러 없이 동작합니다.

Access 에러 길래, 접근 제어자 문제로 판단하였으나, 전부 Public 이라 딱히 문제도 없는것 같은데, 저만 그런건지 궁금합니다.

registerBean 에서도 해당 클래스를 불러오기 때문에, 여기서도 에러가 뜬다면 이해하겠으나..

해당 부분은 문제없고.. 밑에서만 떠서... 궁금합니다

[참고로, 실행하면 컴파일 에러 없이 실행 되고... IDE 상에서는 에러로 계속 남아 있습니다. ]

 

package com.example.helloboot;

import org.apache.catalina.startup.Tomcat;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HellobootApplication {

    public static void main(String[] args) {
        // Spring Container 생성 Context 가 Container 임
        // 컨테이너 생성
        GenericApplicationContext applicationContext = new GenericApplicationContext();
        // 오브젝트 (빈) 등록
        applicationContext.registerBean(HelloController.class);
        // 오브젝트 생성 요청
        applicationContext.refresh();


        // [Step 1] Servlet 컨테이너 생성
        // Factory 생성과 설정 작업등을 대신 해주는 대상
        TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
        WebServer webServer = serverFactory.getWebServer(servletContext -> {
            servletContext.addServlet("frontcontroller", new HttpServlet() {
                @Override
                protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    // 인증, 보안 , 다국어, 공통 기능 등 처리
                    if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
                        String name = req.getParameter("name");

                        // binding 데이터를 처리하는 오브젝트에 데이터를 넘기는 것
                        HelloController helloController = applicationContext.getBean(HelloController.class);
                        String ret = helloController.hello(name);

                        resp.setContentType(MediaType.TEXT_PLAIN_VALUE);
                        resp.getWriter().println(ret);
                    } else {
                        resp.setStatus(HttpStatus.NOT_FOUND.value());
                    }
                }
            }).addMapping("/*");
        });
        webServer.start();
    }
}

답변 1

답변을 작성해보세요.

1

IDE를 쓸 때 간혹 만나게 되는 당황스러운 상황이네요.

IntelliJ 같은 IDE는 코드를 타이핑하는 중에도 실시간으로 부분 컴파일을 해가면서 문법을 체크하고 문제가 있으면 알려주는 기능이 있습니다. 이게 매우 편하긴한데요. 간혹 문제가 없는 코드에서 위와 같이 클래스를 찾을 수 없다는 등의 에러를 표시하는 현상이 발생하기도 합니다. 위에 작성하신 코드는 문제가 없어보입니다. 코드를 실행해서 문제가 없다면 당연한 것이지요.

저는 이런 경우엔 프로젝트 빌드 폴더를 날리거나 IDE 캐시를 지우고 다시 시도해보거나, 개발 장비를 재시작하는 등의 시도를 해봅니다. 근데, 그래도 대부분 안 되더라고요. 그러다가 시간이 지나면 어느 순간 에러가 사라지는 경험을 하기도 합니다. IDE가 완벽한게 아니고, 다른 미묘한 상황에서만 발견되는 버그가 있기 마련이라서, 좀 짜증나기는 하지만 참고 써야할 때가 있는 것 같습니다.

혹시 위 에러가 사라지는 어떤 방법을 발견하시면 알려주세요.

제 개발 장비에서 이 단계의 코드는 IDE 에디터 내에 에러 표시가 나오지 않습니다.

이재현님의 프로필

이재현

질문자

2023.02.02

감사합니다... ~!

스프링 개발은 많이 안해봐서, 제가 잘못한 줄 알았는데 감사합니다

PS. 계속 사용하면 고치려고 했는데, ㅎㅎ 뒤에 강의를 들어보니 스프링 부트 기본 라이브러리로 대체되면서, 추후에 고쳐봐야겠습니다 ~!