묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
HelloSpringApplication 메인 메서드 동작시킬때
HelloSpringApplication 메인 메서드 동작시킬때, application이 실행되면서 서버가 도는 것 같습니다. 궁금한 점이 이때, 작성해둔 모든 컨트롤러, 서비스, 레파지토리, 도메인 등이 같이 가동되는 것인지 궁금합니다. 그리고 컨트롤러가 여러개 있으면 @Controller로 기재된 모든 컨트롤러가 MemberService, MemberRepository 또는 더 나아가 모든 서비스와 레파지토리와 연결되는건가요? 왜냐하면 10분에 나오는 영상에 helloController와 연결된 그림이 있습니다. MemberController와 연결 시켜주는 과정인줄 알았는데 helloController가 그림에 있길래 모든 Controller가 @Service라고 기재된 것과 연결된 것인지 궁금합니다. 사실 더 나아가 service와 repository도 전부 서로서로 연결되는 구조인지 궁금합니다..
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Error parsing HTTP request header 에러
안녕하세요 v5 추가하고 나니 갑자기 이전 작업들도 안되고 다음 오류가 떠서 질문 남깁니다ㅠㅠ 서블릿, JSP, 서블릿 MVC 중에서 서블릿만 작동되고 JSP는 누르면 파일이 다운로드 되네요 나머지는 Whitelabel Error Page와 404가 뜹니다 뭘 잘못 건드린건지 감도 안잡혀요 검색해보니 인코딩 문제일수도 있다는데 저는 크롬을 사용해서 자동으로 인코딩 될텐데.. 문제를 모르겠어요 ㅠㅠ 제 코드는 아래와 같습니다 https://github.com/yeon-06/inflearnMvc1 오류나는 구간은 branch 따로 분리해두었습니다 오류 코드는 아래와 같습니다 2021-05-20 16:35:32.017 WARN 8656 --- [nio-8080-exec-2] o.s.w.s.r.ResourceHttpRequestHandler : Path with "WEB-INF" or "META-INF": [WEB-INF/views/new-form.jsp] 2021-05-20 16:35:32.045 DEBUG 8656 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [776] 2021-05-20 16:35:32.045 DEBUG 8656 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer : Received [] 2021-05-20 16:35:32.045 DEBUG 8656 --- [nio-8080-exec-2] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@5b8d04a4:org.apache.tomcat.util.net.NioChannel@7ca16f33:java.nio.channels.SocketChannel[connected local=/0:0:0:0:0:0:0:1:8080 remote=/0:0:0:0:0:0:0:1:65531]], Status in: [OPEN_READ], State out: [OPEN] 2021-05-20 16:35:34.899 DEBUG 8656 --- [nio-8080-exec-3] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [776] 2021-05-20 16:35:34.909 DEBUG 8656 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1345) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1255) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:794) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:359) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] 2021-05-20 16:35:34.911 DEBUG 8656 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor : Error state [CLOSE_CONNECTION_NOW] reported while processing request java.io.EOFException: null at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1345) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1255) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:794) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:359) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
final관련 질문이 있습니다~
안녕하세요 ~~ 강사님 다름이 아니라 3분 40초에 private static Map<Long, Member> store = new HashMap<>(); 이렇게 작성하셨는데 final키워드를 붙이지 않는 이유에 대해서 궁금해서 질문 드렸습니다! 우선 싱글톤이기 떄문에 래퍼런스도 변경될 일이 없고, 인텔리제이에서도 final 권고 표시가 나오던데, final 키워드를 생략한 이유에 대해서 궁금해서 질문 남깁니다! 감사합니다
-
미해결[NarP Series] MVC 프레임워크는 내 손에 [나프1탄]
아래와 같은 문제, 해결방안.
안녕하세요. 아래 질문자와 같은 오류로 몇시간 허비했는데 다른 분들의 소중한 시간을 지켜 드리고자 해결방안 안내해 드립니다. 저는 맥os big sur + 인텔리제이 ide 환경에서 문제 없이 작동했습니다. - 문제의 원인은 톰캣 1. 톰캣의 lib 폴더에도 jdbc 커넥터 jar 파일을 설치해줘야 됩니다. 심지어 저는 프로젝트의 외부 라이브러리 연동에서 삭제했고 톰캣 lib 에만 복사해줬는데도 작동했습니다. 아마 WAS 서블릿 부분은 jdk 연동이 아니라 톰캣에서 다 처리하기 때문인 것 같습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
폼을 통해 받은 데이터를, 직접 만든 Model에 매핑하는 방법
강사님 안녕하세요, 본편 강의를 다 듣고 혼자 토이 프로젝트를 만들다가 막혀서 질문올립니다. 단순하게 Form을 통해서 데이터를 받아 처리하는 내용입니다그런데 감이 없어 어느 방법이 나이스한 방법인지 모르겠습니다. 1. 직접 만든 모델 클래스는 아래와 같이 생겼습니다. 2. List타입의 필드는 HTML FORM의 element들에 같은 name을 가져와서 바인딩하려합니다 @ModelAttribute는 내부적으로 set메소드를 부르니 역시나 매핑이 안 되더라구요.. 그래서 생각해본 방법으로는 하나하나 RequestParam으로 받아서 처리한다 (List는 MultiValueMap으로) setMethod의 파라미터를 String으로 받아 setMethod에서 내부적으로 처리한다 front 데이터를 Json으로 변환하여 파싱한다 (컨트롤러에서 Model에 접근) 커스텀 어노테이션을 만들고, HandlerMethodArgumentResolver를 implement해서 MyModelResolver를 만들고 @Configuration한다 폼을 통해 받은 데이터를 직접 만든 Model에 매핑하는 방법을보통은 어떻게 구현하는건가요? ps. 사실 저는.. 1~3번이, 제 눈에는 코드가 안예뻐 보였습니다...아뇨 사실은 좋은 현업 코드를 본 적이 없기 때문에 뭐가 예쁜지 안 예쁜지도 모르겠습니다4번으로 만들면 앞단에선 지금처럼 쓰기 편하고, 스프링 내부도 공부할 수 있을 것 같아서 시도해봤습니다. 그런데,메시지 바디로 넘어온 쿼리 파라미터형식의 methodName에 매칭되는 setMethodName이 있는지, 데이터는 들어있는지,데이터 타입은 뭔지, 변환해줘야하는지..이런게 너무어렵습니다.. 이렇게 하다보니 제가 뭘 모르는지도 모른다는 생각이 듭니다. 별것도 아닌 것 같은 것을 어떻게 구현하는게 좋은건지 판단도 못 하는 자신이 너무 바보같습니다ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew.bat 저 처럼 헤메시는분들이 없기를 바라며
저는 cmd를 사용하지 않고 구글에서 cmmder을 설치하여 사용합니다. 제일 먼저 spring 디렉토리로 이동합니다. cd 디렉토리 그 후 ls -al을 입력해 보면 gradlew.bat 이라는 이름의 bat파일이 보이실 거에요. 복사하여 gradlew.bat build를 해줍니다. 위와 같이 Build Successful이라 뜨면 성공한거구요. ls -al을 해보면 build 폴더가 보이실 거고 cd build를 해주신 다음에 cd libs 해주고 해당 디렉토리에서 java -jar hello-spring-0.0.1-SNAPSHOT.jar 이렇게 해주니 성공적으로 실행이 돼네요. 어찌보면 영상에 나와있는 내용 그대로 글로 적은것 뿐이지만 누군가에게 도움이 돼셨길 바라며
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA가 Mybatis를 완벽히 대체 가능한가요?
주니어 개발자로 현재 SI업체에서 근무하고 있는데, 개발시 Mybatis를 사용합니다. 강의를 듣고 간단하게 JPA를 적용해서 샘플 프로젝트정도를 만들어 보았는데 개인적으로는 매우 마음에 들어서 프로젝트에도 한번 써보고 싶어서 사수에게 건의 하였으나 JPA는 간단한 CRUD에는 좋은데 실제 프로젝트에서는 통계등을 조회해야하는데 매우 많은 조인들이 들어가고 sql 쿼리만 수백줄이 되는데, 이런걸 JPA가 대체하기 어렵다. 라는 답변을 받아서 문의 드립니다. 근데 생각해보면 좀 이상한게 해외에서는 JPA가 더 많이 사용된다는데 해외에는 차트같은게 없나..? 싶은 생각이 들더라구요. 그래서 JPA가 mybatis를 완벽히 대체가 가능한건지, 아니면 둘을 병행해서 써야 하는건지 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
servletmvc쪽 질문이 있습니다
안녕하세요 현재 mvc강의를 수강하고 있는 학생입니다 초반에 servlet쪽은 다 따라하고 실행이 잘 되었는데 현재 servletmvc쪽으로 넘어가니 webapp/index.html 쪽부터 시작해서 servletmvc 패키지쪽들은 안되네요 현재 인텔리j 커뮤니티버전 사용중입니다 현재 restart도 해보고 오픈톡방에 질문도 해보았는데 다른분들도 이해가 잘 안된다고 하시네요 ㅠㅠ 현재 404로 못찾고 있습니다 404 -> 맵핑이 제대로 되어있지않다.. 왜이런걸까요??? 메일로 혹시 프로젝트를 보내도 될까요 ?? <현재 오류 내용> Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue May 11 17:08:07 KST 2021 There was an unexpected error (type=Not Found, status=404).
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
dispatcher 질문
안녕하세요 선생님 선생님께서 강의해주신 내용중에서 궁금한게 있습니다. servlet에서 dispatcher.forward를 통해서 html파일을 호출하셨는데 dispatcher보다는 pagecontext 객체에 forward메서드가 있는데 이것도 브라우저에 response를 주지 않고 바로 제어권이 이동하는 문서로 주소가 바뀌지 않고 이동한다고 알고있습니다. 혹시 이 둘이 다른기능을 하는건가요? 선생님께서 dispatcher를 사용하시는 이유가 궁금합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
상품 삭제 관련해서 질문이 있습니다.
먼저 강의 항상 잘 보고 있습니다 선생님!!! 제가 editForm 아래에 <div class="col"> <button class="w-100 btn btn-danger btn-lg" onclick="location.href='item.html'" th:onclick="|location.href='@{/basic/items/{itemId}/edit/delete (itemId = ${item.id})}'|" type="button">삭제 </button></div> 추가후 컨트롤러에 @GetMapping("/{itemId}/edit/delete")public String editDelete(@PathVariable Long itemId) { itemRepository.delete(itemId); return "redirect:/basic/items/";} 추가하여 지우는걸 브라우저에서 성공 했습니다. 다름이 아니라 DeleteMapping 을 사용하여 지우고 싶은데 form method = "delete"로 해도 안되서 질문을 남겨봅니다. 위에 방식대로 하면 실행이 됩니다만 혹시 DeleteMapping 을 사용해서 할 방법이 있을까요??
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
assertThrows로인한 중복회원예외 test 오류
안녕하세요. 너무 유익하게 강의를 수강하고 있습니다. 지난 test 강의에서도 이해가 되지 않아 넘겼던 부분인데, 중복회원예외 함수에서 assertThrows에 오류가 발생합니다. org.opentest4j.AssertionFailedError: Expected java.lang.IllegalStateException to be thrown, but nothing was thrown. 위는 오류 메시지이고, 소스 코드는 강의 내용과 동일하게 작성하여 작성 중 발생한 오류는 없습니다. 답변주시면 감사하겠습니다. 오늘도 좋은 하루 보내시고 열심히 마지막 강의까지 수강해보도록 하겠습니다:)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Repository 관련 질문 드립니다!
안녕하세요 김영한 선생님! 강의 항상 잘 듣고 있습니다ㅎㅎ MVC 패턴 그림을 보다가 문득 궁금한 점이 생겼는데요, 아직 많은 곳에서 (제가 다니는 회사 포함) DB에 직접 접근하여 데이터를 처리하는 객체를 DAO 라는 용어로 사용하고 있는데, 이게 특정 시점부터 Repository 라는 용어를 사용하는 것으로 권장이 된건지, 아니면 ORM을 어떤걸 사용하느냐에 따라 달라지는건지 궁금합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
private final을 사용하신 이유가 있으신가요?
안녕하세요 영한님! 좋은 강의 잘 듣고 있습니다. 지금까지는 FrontController에서 private final 을 사용하지 않으셨는데 v5에서부터는 private final Map<String, Object> handlerMappingMap = new HashMap<>(); private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>(); 위와 같이 private final을 사용하신것을 볼 수 있었습니다. 이유가 무엇인지 알려주시면 감사하겠습니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
13:09 store.clear() 에서 store에 빨간줄이 뜹니다 왜이런가요?
13:09 store.clear() 에서 store에 빨간줄이 뜹니다 왜이런가요? java: cannot find symbol symbol: method clearStore() location: variable repository of type hello.hellospring.repository.MemoryMemberRepository
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
validateDuplicatedName() 관련 질문 드립니다. - 자답 추가!!
회원가입 시 이름 중복 확인하는 메소드 안에서 IllegalAccessException 을 try/catch 문 쓰지 않고 작성을 하셨는데 하신 것을 보고 따라서 try/catch문 쓰지 않고 throw new IllegalAccessException을 하니 error: unreported exception IllegalAccessException; must be caught or declared to be thrown 이라는 에러가 발생합니다. 혹시 어떠한 원인인지 아실까요? 자바 버전은 오라클에서 다운받은 11입니다. ----------------------------------- 자답 추가합니다 ㅠㅠ IllegalAccessException 가 아니고 IllegalStateException으로 적었어야 했네요 ㅠㅠ 하.... 덕분에 강의안을 처음부터 천천히 복습하고 좋았습니다 ^^ ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 다들 화이팅!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
요청에 응답이 오래걸려서 그 사이에 새로고침을 하면 어떻게 될까요?
안녕하세요. PRG 패턴에 대해 듣다가 생긴 의문점인데, PRG 패턴으로 POST 재요청을 막을수 있다는 점에 대해서는 이해를 햇는데 POST요청자체가 응답이 늦어져서 기다리는 상황에서 새로고침을 반복하면서 POST 요청이 반복해서 가는것은 PRG 패턴으로 해결이 안 될 것 같은데 방법이 있을까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 빈의 자원공유 관련 질문드립니다
이번에 회사에서 Spring Security로 동적 ACL을 개발하다가 사용자 별로 독립적인 권한을 주고, 이 권한에 따라 사이드메뉴에 보이는 항목들을 다르게 해주었는데요. 이때 모든 쓰레드가 각 권한별로 갖고있는 리소스 접근권한 정보에 대해 알게하고 싶어(사이드 메뉴를 렌더링해야 하므로) 스프링 빈을 하나 만들고 이 빈에 해당 정보를 공유자원으로 등록했습니다. 자료구조는 ConcurrentHashMap을 썼습니다. 모든 쓰레드가 공유해야 할 자원이라 스프링 빈을 썼고 이로 인해 어떤 문제가 발생할 수 있을지 곰곰히 고민해봤는데 대략적으로 어떤 문제들이 발생 할 수 있는지 잘 모르겠습니다. 대부분의 스프링 책과 강의들에선 스프링 빈은 모든 쓰레드에서 상태를 공유하므로 사용에 주의를 기울여야 한다라거나 불변해야 한다는 이야기를 많이하지만, 자원을 공유하기 위해 스프링 빈을 쓰라는 얘기는 못봤었거든요. 왜 공유해야만 하느냐면 이렇게 하지 않으면 유저별로 로그인할때마다 데이터베이스에서 자신이 갖고있는 리소스 접근권한을 모두 검색해서 가져와야만 하는데, URL의 개수가 너무 많았기 때문입니다. 혹시 어떤 문제가 발생할 수 있을지, 더 좋은 방법은 없었는지에 대해 의견을 구합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 빈의 역할이 무엇인가요?
안녕하세요! 스프링 빈의 역할이 무엇인지 잘 모르겠습니다..! 빈 자체의 개념이 이해가 안가서 서치를 좀 해보니" 매번 클라이언트에서 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들어서 사용한다고 생각해보자 요청 한 번에 5개의 오브젝트가 새로 만들어지고 초당 500개의 요청이 들어오면, 초당 2500개의 새로운 오브젝트가 생성된다. 서버가 감당하기 힘들다."그래서 빈이 필요하다 라는 말을 봤는데 그 필요성은 알겠으나 정확하게 빈이 무엇인지 모르겠습니다 또한 왜 new로 선언하면 빈이 되지 못하는건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
핸들러 매핑 방식이 궁금합니다
안녕하세요! 어댑터 이후 머릿속이 복잡해서 질문이 많더라도 양해부탁드립니다ㅠㅠ 1. 이전에 했던 V5에서는 프론트 컨트롤러 생성자에서 핸들러와 핸들러어댑터 매핑이 이루어졌는데, 스프링에서도 DispatcherServlet이 생성될때 매핑을 하는것인가요? DispatcherServlet도 스프링 컨테이너에 빈으로 등록이 되는건가요? 2. @Component("/url")등이 스프링 빈으로 등록될 때 스프링에서 자동으로 RequestMappingHandlerMapping과 BeanNameUrlHandlerMapping등의 Map객체에 넣어놓고 필요할때 조회하는 방식이 맞나요? 아니면 BeanNameUrlHandlerMapping등이 함수처럼 요청이 생겨 필요할때 빈들을 돌아가며 찾는것인가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
service 메소드를 public으로 가져오면 안되는 이유가 있나요?
안녕하세요 영한님! 다름이 아니라 service 메소드를 override할 때 protected로 되어있는 코드를 만들어야 한다고 해주셨는데 그 이유가 뭔지 설명 해주시면 감사하겠습니다. protected로 접근 제어자를 지정하면 같은 패키지 이거나 다른 패키지라도 상속관계라면 해당 메소드에 접근이 가능할텐데 혹여 public으로 지정했을때 다른 패키지에 존재하는 클래스에서 해당 메소드를 override 할 수 있는 가능성을 없애기 위해서 인가요? 감사합니다.