TIL - 090322

케이·2022년 3월 10일
0

TIL

목록 보기
10/13

스스로 부족한 것을 채우기 위한 학습 기록입니다. 부족함을 알고 채워나가려 노력하고 있습니다. 틀린 부분이 있다면 언제든지 지적해주시면 감사하겠습니다.🙏🏻

No newline at a end of file

  • 왜 파일 끝에는 개행 문자를 넣어야 하는 걸까?
    • 지금 우리가 사용하는 컴파일러들은 개행 문자가 없어서 컴파일이 안되는 일은 없겠지만, 옛날에 C컴파일러에서 개행문자가 없으면 문제가 발생했다고 한다.
      C컴파일러는 소스코드를 한 줄씩 읽어오는데 실제로 파일은 끝났더라도 개행문자가 없으면 끝나지 않은 것으로 인식했다고 한다.
      또한 터미널에서 cat 명령어를 사용해 출력을 해보면 개행 문자가 없으면 보기도 좋지 않다고.
      (참고: https://minz.dev/19)

생성자가 하나일 때 @Autowired를 생략 가능한 이유?

  • 김영한님 강의에서도 생성자가 하나일 때 @Autowired를 생략 할 수 있다고 나왔는데 그 이유는 기억이 나질 않고 코드 리뷰를 받으면서 질문 받아서 해당 내용을 검색해 보았다.
  • 먼저 자바 API 문서를 살펴보니
    If a class only declares a single constructor to begin with, it will always be used, even if not annotated. 어노테이션이 없어도 하나의 생성자만 가지고 있다면 항상 쓰일 것이라고 쓰여 있었다. 이게 뭔 소리인가 싶어서 Stack Overflow에서 검색해보았다.
  • 답변: Starting with Spring 4.3, if a class, which is configured as a Spring bean, has only one constructor, the @Autowired annotation can be omitted and Spring will use that constructor and inject all necessary dependencies.
    결국 '생성자 하나만 가지고 있는 경우엔 스프링이 모든 필요한 의존성을 그 생성자에 주입해줄 것이기 때문에 생략할 수 있다.'라고 나와 있었고 내가 놓친 것인지 더 자세한 이유는 찾지 못했다. ~~ (컴퓨터로 글 읽는게 힘들어서 라고 핑계를 대본다..)~~

참고
https://stackoverflow.com/questions/41092751/spring-injects-dependencies-in-constructor-without-autowired-annotation
https://www.baeldung.com/constructor-injection-in-spring


Getter 와 Setter 사용 지양하기

  • 왜 getter와 setter의 사용을 지양해야하는가?
    • 사용을 지양하기 전에 그 이유에 대해서 찾아보았다.
      Getter와 Setter는 객체의 상태를 외부에 노출하고 이렇게 되면외부에서 그 상태를 충분히 변경할 수 있는 가능성이 있다. 객체의 상태가 다른 외부의 영향을 많이 받게 되면 보안과 유지보수가 어렵다고 이해했다.
  • Getter 사용 지양하기
    • 객체는 독립적이어야 하는데 Getter를 사용해서 그 값을 가져오거나 처리하도록 하는 메소드가 많아지면 Getter에 대한 의존성이 높아진다.
    • 그러니 Getter가 아닌 객체가 직접 행동할 수 있도록 해야한다.
      예를 들어
    if(user.getStatus() == "VIP") {
      price = price * 0.9;
     } else {
     ...
     ..
    정말 대충 짠 코드지만 이런 코드가 있다고 치면 user의 getStatus()를 사용하는 것이 아니라 isVIP() 같은 메소드를 객체가 갖게 해서 객체가 행동할 수 있도록 해야한다.
    • 또한 DTO(Data Transfer Object)을 이용해서 해결할 수도 있다는 생각이 들었다. DTO는 말 그대로 데이터의 전달을 목적으로 설계되는 객체이기 때문에 (예를 들어) userDTO를 사용해 데이터를 꺼내고 수정할 수 있도록 하면 이 문제가 해결 되지 않을까..? 라는 생각이 들었다.
  • Setter 사용 지양하기
    • Getter는 그렇다고 치더라도 Setter는 정말 사용을 지양해야 한다는 글들을 많이 봤다. 그럼 어떻게 Setter을 사용하지 않을 수 있을까?
      제일 간단한(?) 방법은 생성자를 가지고 처리하는 것이다!!!!
      이 외에도 builder 패턴을 사용할 수 있다고 한다. (하지만 아직 쪼렙인 나에겐 너무 어려운걸..? 디자인 패턴은 스프링 학습이 어느정도 진행된 이후에 시작할 예정이다!)

참고
https://velog.io/@sezeom/Getter-Setter-%EC%A7%80%EC%96%91%ED%95%98%EA%B8%B0
http://blog.eomdev.com/ddd/2019/08/20/ddd-setter.html
https://limdingdong.tistory.com/15#recentEntries

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글