impolements러 interface를 받아 class를 만들때 private이 안되는 오류를 보여주셨는데요 interface를 사용하지 않고 그냥 class안에서 type을 지정하는 방법, abstract class를 이용하는 방법 모두 이해됬습니다. 하지만 interface를 사용하면 private, protected 사용이 불가한 것인지 잘 모르겠어서 질문을 올립니다. 구글링해본결과 class내에 속성으로 만들고 getter, setter를 이용하는 것으로 우회하는 방법을 사용하더라구요. ( https://stackoverflow.com/questions/37791947/how-to-define-a-private-property-when-implementing-an-interface-in-typescript ) 이렇게 했을 때 private의 기능인 class 밖에서는 호출 할 수 없다고 위반되는 결과가 나옵니다. 어떤식으로 해결 해야 할까요? interface Interface { readonly a: string; b: number; } class TSClass implements Interface { private readonly _a: string = "init"; get a() { return this._a; } protected _b: number = 1; get b() { return this._b; } set b(v: number) { this._b = v; } c: string = "기본값이 public"; method() { console.log(this._a); console.log(this._b); console.log(this.c); } } class inheritClass extends TSClass { method() { console.log(this._a); // error console.log(this.a); // 가능.. console.log(this._b); console.log(this.b); console.log(this.c); } } new inheritClass()._a; // error new inheritClass().a; // 가능... new inheritClass()._b; // error new inheritClass().b; // 가능.. new inheritClass().c;
안녕하세요! 김영한 선생님의 스프링 핵심 원리 강의를 수강하고 있는 학생입니다:) 다름 아니라 setter 주입의 예제 코드와 관련하여 궁금한 점이 생겨서 질문을 남기게 되었습니다. 강의 13:26 에 나와있는 코드와 동일하게 setter와 생성자에 화면 출력 기능을 추가 하였습니다. 그 결과, AutoAppConfig.class를 설정 정보로 하는 test 클래스를 실행하면 설명해주신 내용과 같이 생성자를 통한 의존 관계 주입이 먼저 일어나고 setter를 통한 의존 관계 주입이 나중에 일어남을 확인할 수 있었습니다. 더 나아가 AutoAppConfig.class가 아닌 AppConfig.class를 설정 정보로 하는 test 클래스를 실행 하면 콘솔 화면에 어떤 내용이 출력될지 호기심이 생겨 test.java.hello.core.beanfind 패키지에 위치한 ApplicationContextBasicFindTest 클래스를 실행하였습니다. 실행 전에 저는 orderService라는 이름의 스프링 빈이 등록되는 과정에서 orderServiceImpl() 생성자가 호출되기 때문에 System.out.println("1. OrderServiceImpl.OrderServiceImp"); 코드가 실행될 것이라 예상하였습니다. 또한, (1) AppConfig.class엔 setMemberRepository()와 setDiscountPolicy()를 호출하는 코드가 없고 (2) AppConfig.class는 @ComponentScan를 사용하지 않기 때문에 setMemberRepository()와 setDiscountPolicy()가 @Autowired를 사용하고 있더라도 의존 관계를 자동으로 주입할 수 없어 해당 메소드(setter) 내부에 기재되어있는 System.out.println("memberRepository = " + memberRepository); 코드와 System.out.println("discountPolicy = " + discountPolicy); 코드는 실행되지 않을 거라 예상 했습니다. 하지만 저의 예상과는 다르게 setMemberRepository()와 setDiscountPolicy()가 모두 실행되었고 제가 어느 부분에서 잘못 생각하고 있는지 도움을 구하고자 질문을 남기게 되었습니다.
수강생분들에게 정보 공유해드리고 싶어서 게시판에 글 남깁니다. ModelMapper 를 사용하면 객체에서 객체로 쉽게 변환할 수 있습니다. 그런데 Setter 를 사용하지 않은 Entity 또는 객체 에서 Dto 로 변환할 매핑되지 않는 문제가 발생합니다. 이를 해결하기 위해서 ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE) .setFieldMatchingEnabled(true); 위와 같이 설정한뒤 사용하면 됩니다.^^ 저는 @Bean public ModelMapper modelMapper() { ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE) .setFieldMatchingEnabled(true); return modelMapper; } 빈으로 등록해서 사용했습니다.ㅎㅎ InheritingConfiguration 클래스에서 ModelMapper 기본 fieldAccessLevel 이 fieldAccessLevel = AccessLevel.PUBLIC; 임을 확인 할 수 있습니다.^^ public class InheritingConfiguration implements Configuration { //...// /** * Creates an initial InheritingConfiguration. */ public InheritingConfiguration() { parent = null; typeMapStore = new TypeMapStore(this); converterStore = new ConverterStore(); valueAccessStore = new ValueAccessStore(); valueMutateStore = new ValueMutateStore(); sourceNameTokenizer = NameTokenizers.CAMEL_CASE; destinationNameTokenizer = NameTokenizers.CAMEL_CASE; sourceNamingConvention = NamingConventions.JAVABEANS_ACCESSOR; destinationNamingConvention = NamingConventions.JAVABEANS_MUTATOR; sourceNameTransformer = NameTransformers.JAVABEANS_ACCESSOR; destinationNameTransformer = NameTransformers.JAVABEANS_MUTATOR; matchingStrategy = MatchingStrategies.STANDARD; fieldAccessLevel = AccessLevel.PUBLIC; methodAccessLevel = AccessLevel.PUBLIC; fieldMatchingEnabled = Boolean.FALSE; ambiguityIgnored = Boolean.FALSE; fullTypeMatchingRequired = Boolean.FALSE; implicitMatchingEnabled = Boolean.TRUE; preferNestedProperties = Boolean.TRUE; skipNullEnabled = Boolean.FALSE; useOSGiClassLoaderBridging = Boolean.FALSE; collectionsMergeEnabled = Boolean.FALSE; } //...// } 참고하세용^^
안녕하세요. 영한님과 서포터님들 덕분에 즐겁게 공부하고 있습니다. 주문, 주문상품 엔티티 개발 강의를 듣던 중 궁금한 것이 생겼습니다. 강의에서 보시면 클래스 내부에서 생성 메서드 혹은 비즈니스 로직 메서드를 구현하시면서 getter/setter 메서드를 사용하시는데요. 이렇게 클래스 내부에서 사용할 때도 필드에 직접 접근하는 것보다는 getter/setter 메서드를 사용하는 것이 권장되는가요? 단순히 생각했을 때는 불필요한 메서드 호출만 일어나는 것 아닌가해서 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 제목 그대로 수정자 주입이 아닌, 생성자 주입을 해야하는 이유에 대한 설명 중 이해가지 않는 부분이 있어서 질문드립니다 ppt에 " 수정자 주입을 사용하면, setXxx 메서드를 public으로 열어두어야 한다. " 라는 근거가 있는데요. setter는 반드시 public으로 열어야하는 것 아닌가요? , public이 아닌 접근제어자로 setter를 작성하는 경우도 있나요? 그래서 전 이 부분을 수정자 주입을 위해선 setter가 필요없는, 혹은 변경될 위험이 있어서 getter만 작성하고 setter를 작성하지 않는 클래스에도 setter를 포함해야한다. 라고 이해하였는데 이게 의도하신 의미일까요?