@AuthenticationPrincipal -> 로그인 정보를 매개변수로 받고 싶다면 이걸 쓰자!
이걸 사용하면 username을 바로 반환해서 로그인시 '***님, 환영합니다' 같은 메시지를 띄울 수 있다.
저거 하위패키지 싹 훑어서 @Component 붙은 애들한텐 전부다 일수도장마냥 콩아이콘 좌라락 붙여주는 완두살인마인디, Controller / Service / Repository 엔 무조건 콩아이콘 붙는다.
Spring = 일수꾼
IoC 컨테이너 = 일수꾼이 관리하는 쓸모있는 콩 창고
빈 = 쓸모있는 콩
@Component 붙은 애들 = 쓸모있는 콩이 되어 창고로 들어갈 애들
Dispatcher servlet = 야 고객님이 원하신다 이거 처리할수 있는 놈 나와봐(요청 들고옴)
핸들러 맵핑 = 처리할수 있는 놈 찾았습니다!
핸들러 어댑터 = 야 일해 고객님이 원하시잖아 (핸들러 내부의 메소드 돌림)
생성자는 왜 필요해? -> 초기화해서 변수 사용하려고.
어노테이션은 프로그램한테 알려주는 것임.
@autowired - 주입할거라고 알려주는 것.
예를들면 AutoRepository 타입으로 등록된 애는 하나밖에 없을거라 자동으로 걔를 묶어줌.
캡상추다? 캡슐화 상속 추상화 다형성. 객체지향의 가장 중요한 개념.
스프링은 대부분의 것들이 private으로 선언되어 있음. 그러면 접근 못하는데? 어떻게 갖다 써요?
-> AutoWired를 쓰면 private이어도 다 무시하고 얘가 알아서 가져가다 묶어줄수 있음. 이게 필드 주입임. 이거 달려있는 애들은 스프링 구동시키면서 Bean으로 등록됨.
메서드 주입하려면 final 못넣음. final은 쓰기전에 초기화 해줘야하기 때문.
보통 필드주입은 거의 안씀. 메서드 주입은 상황에 따라 필요할때만 씀.
대부분 생성자 주입을 사용하는 이유중 하나가, 주입 받으려는 final을 쓸수 있음. (불변성 유지)
->final 쓸수 있는데 뭐? 어쩌라고? 라고 한다면... 그것은 나중에 좀 차근차근 공부하도록 하자.
생성자가 여러개 있지만 않다면 Autowired를 생략해도 문제는 없다. @AutoWired = 야 니가 알아서 갖다 엮어서 주입해줘
@RAC를 달면 final이 달린 애를 찾아다가 전부다 생성자를 넣어준다. 이것의 사용은 사실 조직마다 달라서, 쓰지 말라고 하는곳도 있긴 함.
Spring한테 부탁하려면 Spring이 아는 애(=빈으로 등록된 애)여야 한다는거군 🤔
야! 여기 니가 빈을 등록해달라던 타입의 애가 한두개가 아닌데? 나 뭔지 모르겠어. 라고 메시지가 뜰 경우?
-> @Primary를 붙인다
-> 해당 Service의 이름을 바꾼다
Bean에 등록되는 경우는 클래스명을 따라서 카멜케이스로 이름이 자동등록 되기 때문에, 그 이름으로 등록해줘버리는 경우도 있다.
-> @Qualifier("Pizza") 를 붙여준다.
그거 알아? @Primary가 달려있더라도 @Qualifier 붙으면 걔가 들어감.
90%인 MySQL에는 @Primary를 걸고 10%인 MongoDB에는 @Qualifier를 줘서 좀더 좁은 범위로 직접주입한 경우라면?
-> 유지보수도 쉽고 관리하기도 좋다. 잘 붙여놓은 것!
@Resource, @Injection 등도 있다. 근데 @Autowired가 기능도 좀더 많고 사용할 수 있는 대상도 많아서 확장성이 좋다. 가장 보편적으로 쓴다.
@Injection은 외부 라이브러리를 끌고와서 사용해야 해서 많이 쓰진 않는다.
Bean이 scope라는 개념이 있음. Singleton 이라고 한번만 만들어 사용한다. Dispatcher servlet처럼 한개 만들어서 계속 씀.
-> 요청이 들어올때마다 Bean을 만들어 쓰는 경우도 있긴 한데, 그땐 설정을 변경해서 때마다 만들어지도록 쓰기도 하는데, 지금은 중요하지 않다.
그걸 알았으면 다음은 불변성(Immutable)을 공부해보면 됨. final 얘기할때 한번 나왔지만, 불변성이 진짜 중요하다.
예를 들어 내가 int cnt = 0; 했는데 어딘가에 cnt++; 해놨다 치자.
그런데 모든 쓰레드가 다 공유하게 됨 -> 모든 요청에 해당 변수가, 혹은 그 cnt++;가 공유된다. 이러면 이제 난리남!
디자인패턴 전혀 모른 채로 그냥 자바공부만 열심히 했는데 내 자바 코드가 디자인패턴 중에 있는 경우 - 이러면 좋지. 최고임.
-> 그러나 일반인이 이렇게 하긴 어렵다. 디자인 패턴을 먼저 보는것도 좋다고 생각한다.
Dispatcher servlet - 템플릿 메서드 패턴으로 되어있다.
Bean 등록 - 팩토리 메서드 패턴으로 되어있다.
안맞는 방법이면 절대 하지말것!!!!
-> Spring 말고 JAVA로 직접 해보면 좋긴 하다. 그러나 그건 SQL, JAVA, 기본 CRUD 등등 기초가 어느정도 되어있는 상태에서 해볼 것. 이건 레벨업 방법임. SQL, DB 같은게 더 중요함. 정규화/비정규화나 DB개론 개념 같은거.
지금은 람다 몰라도 됨! 지금 찾아보지마. 진짜 찾아보지마.
Bean이 확장된게 @Resource? ApplicationContext? 임. G17n 등 여러 기능이 있음. 보통 쓰다보면 보다 많은 기능이 필요해서 확장하게 됨. 그중 하나가 이것.