• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

내부클래스 접근지정자

23.12.06 20:43 작성 조회수 563

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

DTO 클래스를 내부클래스로 만들었는데, 접근지정자를 public으로 지정해주지 않으면

 

Class 'CreateMemberResponse' is exposed outside its defined visibility scope

Class 'CreateMemberRequest' is exposed outside its defined visibility scope

 

이런식으로 경고가 발생합니다.

강의에서는 public으로 지정하지 않아도 경고창이 뜨지 않았는데 왜그런걸까요?

 

답변 1

답변을 작성해보세요.

2

안녕하세요. 성이름님

도움을 드리고 싶지만 질문 내용만으로는 답변을 드리기 어렵습니다.

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

감사합니다.

성이름님의 프로필

성이름

질문자

2023.12.08

링크를 잘못 주신 것 같아서 우선 코드만 올려봅니다..

 

저 나름대로 찾아봤는데 CreateMemberResponse나 CreateMemberRequest같은 내부 클래스는 패키지 내에서만 사용 가능한데, 그 클래스를 사용하고있는 join 메서드는 public으로 열려있어서 경고를 나타내는 것 같아요.

 

하지만 컨트롤러는 클래스와 메서드 모두 public으로 열어놔야 사용가능한걸로 알고있는데...

그렇다면 그냥 무시해도 되는 경고라고 생각해도 될까요?

 

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/members")
public class MemberController {

    private final MemberService memberService;

    // 가입
    @PostMapping
    public CreateMemberResponse join(@RequestBody CreateMemberRequest request) {
        Member member = Member.create(request.getEmail(), request.getNickname(), request.getPassword());
        Long id = memberService.join(member);
        return new CreateMemberResponse(id);
    }

    @Data
    static class CreateMemberRequest {
        private Long id; // 멤버 id
        private String email;  // 이메일
        private String nickname;    // 닉네임
        private String password;    // 비밀번호
    }

    @Data
    @AllArgsConstructor
    static class CreateMemberResponse {
        private Long id;
    }

//    // 전체 회원 조회
//    @GetMapping("/v1")
//    public List<Member> findAllMembers1() {
//        return memberService.findMembers();
//    }
//

    // 전체 회원 조회
    @GetMapping("/v2")
    public Result<List<MemberDTO>> findAllMembers() {
        List<Member> findMembers =memberService.findMembers();
        List<MemberDTO> collect = findMembers.stream()
                                            .map(m -> new MemberDTO(m.getId(), m.getEmail(), m.getNickname()))
                                            .collect(Collectors.toList());
        return new Result<>(collect.size(), collect);
    }

    @Data
    @AllArgsConstructor
    static class Result<T> {
        private int total;
        private T data;
    }


    @Data
    @AllArgsConstructor
    static class MemberDTO {
        private Long id; // pk
        private String email;  // 이메일
        private String nickname;    // 닉네임
    }

    // 수정
    @PatchMapping("/{id}")
    public UpdateMemberResponse updateProfile(@PathVariable Long id, @RequestBody UpdateMemberRequest request) {
        memberService.update(id, request.getNickname(), request.getPassword());
        Member findMember = memberService.findOne(id);
        return new UpdateMemberResponse(findMember.getId());
    }

    @Data
    static class UpdateMemberRequest {
        private String nickname;    // 닉네임
        private String password;    // 비밀번호
    }

    @Data
    @AllArgsConstructor
    static class UpdateMemberResponse {
        private Long id;
    }

}

 

OMG님의 프로필

OMG

2023.12.08

안녕하세요. 성이름님, 공식 서포터즈 OMG입니다.

 

아래 링크를 참고하여 프로젝트 폴더를 공유해주세요.

https://bit.ly/3fX6ygx

 

강의에서 제공해드리는 코드에 올리신 코드를 복사하여 확인해보았으나, 강의와 다르게 작성한 점이 확인되었으며 (이메일 필드 등)

Class 'CreateMemberResponse' is exposed outside its defined visibility scope

Class 'CreateMemberRequest' is exposed outside its defined visibility scope

 

경고 메시지는 확인되지 않습니다. 일부 코드만으로는 재현되지 않으니 코드를 공유해주세요.

그리고 사용하고 있는 IDE 정보와 발생하는 상황에 대한 캡쳐화면도 올려주시면 확인에 도움이 됩니다.

 

감사합니다.

인프런에 글쓰기 시점에 링크가 달라지네요.

업로드는 다음을 참고해주세요.

https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.yzd7ugcaglvn

감사합니다.

성이름님의 프로필

성이름

질문자

2023.12.10

주말에도 도움을 주셔서 감사합니다 😄

 

구글 드라이브 링크 : https://drive.google.com/file/d/19KOD1w2J99G2qDvP4VBCK0QozpLd9Cwo/view?usp=sharing

실행하는 데에는 문제가 없습니다. 포스트맨으로 api 호출했을때 정상적으로 실행이 됩니다.

다만 CreateMemberResponse, CreateMemberRequest 같이 컨트롤러 메서드의 요청클래스와 응답클래스마다 노란줄이 뜨고 내용을 확인해보면 아래와 같습니다.

수업 내용과 코드가 달라서 생기는 문제인가 해서 강의 소스 코드를 다운로드 받았는데 똑같은 경고가 뜹니다.

image

image

인텔리제이 2023.2.1 버전 쓰고 있고 부트는 2.7 자바 11입니다

안녕하세요. 성이름님

IntelliJ IDEA에서 주는 이 경고는 실제 실행에는 문제가 없지만, 가시성과 가독성, 그리고 코드의 일관성이나 유지 보수의 측면에서 알려주는 것입니다.

이 경고를 보기 싫다면 CreateMemberRequest, CreateMemberResponse 클래스를 public으로 변경하시면 됩니다.

참고로 해당 코드를 읽어서 요청 또는 응답으로 만들어야 하는데, 특정 라이브러리에서는 public이 아니면 문제가 될 수 있습니다. 스프링이 사용하는 JSON 라이브러리들은 이 경우에 default(package-private)의 경우에도 문제가 발생하지 않습니다.

감사합니다.

OMG님의 프로필

OMG

2023.12.10

안녕하세요. 첨부하신 프로젝트 코드 확인하였습니다.

해당 warning이 발생하는 코드는 MemberApiController.java 클래스 이나

프로젝트 코드에는 포함되어 있지 않네요.

image

initial commit부터 아래 커밋까지 쭉 확인해봤는데 없었습니다.

image

MemberApiController가 포함된

재현 가능한 코드로 공유 부탁드립니다 😀