일단 씻고 나가자
23.10.19 본문
2023. 10. 19 목요일
- [Effective Java] stream의 유의점? Map으로 변환하는 2가지 방법?
: stream은 순수함수이기 때문에, 외부의 객체를 변경하는 로직은 안 좋다.
(ex. forEach로 for문을 대신하여 stream 외부의 list를 변경하거나)
stream을 Map으로 변경하는 방법은 toMap, groupingBy 두 가지가 있다.
new ArrayList<User>().stream().collect(Collectors.toMap(User::getName, User::getAge))
new ArrayList<User>().stream().collect(Collectors
.groupingBy( user -> ((int) user.getHeight / 5 * 5), Collectors.counting
- [Spring] 스프링의 탄생 배경과 변천 과정?
: 서비스의 요구사항이 달라짐에 따라 특정 인터페이스에 다른 객체를 주입해야 할 때가 많아지는데, 순수 자바 코드로 작성할 때는 그것을 하드 코딩으로 일일이 주입해주어야 했기 때문에 service, controller 등의 논리적 단계 구분이 어려웠다.
따라서 config라는 단계를 나누어, 해당 부분에 설정 관련된 부분 (특정 요구사항에서는 어떤 객체를 주입할지)을 모두 설정하고 각 논리적 단계를 견고히 했는데, (이때 객체 == bean)
이전에는 xml을 이용해 각 객체와 객체의 이름을 부여하여 설정하고 main 메서드 내에서 해당 경로의 xml 파일을 참조하여 설정했다.
하지만 xml은 오타의 위험성과 작성해야 할 부분이 너무 많았으므로 생산성에서 문제가 있었는데, 이를 보완하기 위해 각 클래스에 @Component라는 어노테이션을 붙이고 xml 파일 내에서 component scan이라는 기술을 도입하여 해당 한 줄로 어노테이션이 붙은 클래스를 모두 자동으로 bean으로 만들어주었다.
이후엔 config 관련 내용을 자바 클래스 내부로 들였는데,
이때에도 config 관련 클래스 내부에 아무것도 적지 않고 @ComponentScan 어노테이션을 이용해 지정된 경로 하위의 @Component 어노테이션이 붙은 클래스들을 모두 자동으로 주입해주었다.
spring은 spring-boot-starter이라는 의존성을 제공하는데,
해당 방식을 이용하면 main 메서드 내부에 SpringApplication.run()이라는 함수를 제공하고,
해당 함수 내부엔 @ComponentScan이 설정되어 있다.