전체 글 170

빈 객체 등록의 자동화: 컴포넌트 스캔( @Autowired 과는 별개의 개념임. 혼동X) 2021-06-02

우선적으로 내가 헷갈린 부분은 컴포넌트 스캔이 마치 @Autowired의 대체재같은 느낌을 받은 것이다. 무언가 자동화...주입..스프링 이런 말을 보고 내가 오해한 것 같다. 하지만 확실하게 구별해야 한다. @Component : 자바 빈 객체를 @Configuration에서 @Bean 이렇게 설정메서드를 통한 수동 등록이 아닌, 스프링이 편하게 @ComponentScan 애너테이션을 통해 자바 빈에 등록해줄 클래스를 지정하는 애너테이션. @Autowired: 이미 등록된 자바 빈 객체를 의존주입을 위해 기존에는 세터나, 생성자 주입방식으로 DI를 했다면, 이젠 스프링에서 @Autowired가 붙여진 클래스와 같은 타입의 빈 객체를 찾아서 DI 해주기 위해 필드나, 메서드 앞에 붙이는 애너테이션. 요약..

백준 1965번 상자넣기

우선 증가하는 부분수열 문제를 dp로 풀수 있다면 이 문제또한 쉽게 풀수 있을것이다. 애초에 앞의 상자보다 값이 작으면 뒷 상자에 넣을수 있다는 조건이, LIS 문제의 정의와 같다. 다만 주의해야 할 점은, if 조건문에서 단순히 이전값이 현제 인덱스의 값보다 작을시, 이전 dp값에 +1한 것을 현재dp값에 더해주는것을 가능하게하는 조건으로 작용하는 것이 아니라,(아래의 코드에서 dp[i]=dp[j]+1 부분) 이전 dp의 값+1 한 것이 현재 dp의 값보다 커야한다라는 조건도 있어야 된다는 것이다. 나도 처음에 이 조건이 왜 필요한지 생각하느라 애를 참 많이 썼는데, 간단히 설명하자면 이전 값이 현재의 값보다 더 작다는 조건에 만족하는 중복된(같은수)를 카운트하는것을 방지하기 위한 장치이다. 예를 들면..

자동의존의 대상이 되는 클래스가 자손클래스일때, @Autowired 사용시 에러 처리법. 2021-06-01

우선 만약 이전 포스트에서는 @Autowired를 붙여서 자동의존주입을 하고자 하는 클래스의 타입이 빈 객체에 등록된 타입을 스프링이 탐색했을때, 1개로 특정지어지지 않을 경우 스프링은 에러를 낸다고 배웠다. 이번엔 쫌 다른 경우인데, 만약 스프링 빈에 등록할 객체가 이미 등록되어있는 빈 객체를 상속받은 클래스타입이라면 어떻게 될까? 예를 들어보자. public class MemberSummaryPrinter extends MemberPrinter { @Override public void print(Member member) { System.out.printf( "회원 정보: 이메일=%s, 이름=%s\n", member.getEmail(), member.getName()); } } 만약 이렇게 이미 빈..

스프링 의존 자동 주입 @Autowired와 @Qualifier, 2021-05-31

이전 포스트에서 설정클래스의 의존이 필요한 필드에 @Autowired 애너테이션을 붙이면 스프링에서 @Autowired 가 붙여진 클래스와 타입이 같은 빈 객체를 찾아서 필드에 할당한다. 오늘 공부한 부분은 이 @Autowired를 위치시킬수 있는 곳이다. 1. 필드 우선 가장 기본적인 형태로 의존이 필요한 클래스에서 의존의 대상이 되는 클래스의 참조변수에다가(인스턴스변수) @Autowired를 붙이는 것이다. public class ChangePasswordService { @Autowired private MemberDao memberDao; public void changePassword(String email, String oldPwd, String newPwd) { Member member = ..

DI의 두가지 방식: 생성자 방식, 세터 메서드 방식, @Configuration 설정클래스의 @Bean 설정은 항상 스프링에서 싱글톤객체로 등록함. [최범균 스프링 5] 2021-05-29

우선 빈 객체를 등록할때 설정클래스에서(@Configuration) 어떤 빈 객체의 의존 주입하는 방식은 2가지가 있다. 1.첫번째는, 앞 포스트에서 설명했던 것 처럼 생성자의 파라미터로 의존의 대상이되는 객체를 넣어주는 것이다.[ 실제@Configuration 클래스에서는 객체설정메서드(@Bean) 를 파라미터로 넘겨줌] 장점: 빈 객체를 설정할때 이미 그 클래스가 의존하는 모든 객체를 주입받기 때문에, 완벽한 상태(그 클래스가 의존하는 모든 클래스의 메서드 들을 사용가능) 에서 빈 객체를 사용 가능하다. 단점: 생성자의 파라미터 개수가 많을 경우, 어떤 객체가 들어가야할지 모를 수 있어서 생성자 코드를 직접 확인해 봐야한다....라고 책에서 주장하는데 나는 그렇게 생각하지 않는다.IntelliJ는 애..

스프링의 근원적 역할= 객체조립기, [최범균 스프링5 책] 2021-05-28

이전 포스트 들에서 DI와 의존주입하는 방법을 객체조립기에 대한 내용으로 설명했다. 그런데 난 이런 의문이 들었다. 이 책은 스프링에 대한 본격적인 기능을 바로 설명해주지 않고, DI, 객체조립기 같은 것을 알려주지? 이번 장을 공부하면서 바로 이유를 알게 되었다. 바로 스프링의 툴의 기능이 DI를 지원하는 객체 조립기 이기 때문이다. 즉, 앞선 포스트에서 자바 코드를 통해 구현한, Assembler클래스를 스프링의 힘을 빌리면 훨씬 더 표준적으로 구성할 수있어서, 유지보수성이 뛰어나다. 차이를 비교해 보기 바란다. 1. 일반 자바코드로 작성한 객체조립기. import spring.ChangePasswordService; import spring.MemberDao; import spring.MemberR..

스프링 객체조립기(assembler), 백준 11725번 문제를 풀며 든 인접리스트에 대한 생각. [최범균 스프링 5] 2021-05-26

객체 조립기는 이전 포스트에서 내가 DI가 필요한 이유에 대해서 설명할 때, 객체생성에 사용할 클래스를 변경하기 위해(의존을 하는 클래스는 변경하지 않고) 객체를 주입하는 코드 한 곳 만 변경하는것이 DI의 장점이라고 하였다. 그렇다면 이 '한 곳'에 실제 객체를 생성하는 곳이 필요한데 그것이 바로 객체조립기이다. 백준 11725번. 그래프 구현 방법중 인접리스트의 각 배열에 저장된 리스트 요소들의 정렬에 대한 고찰. ->일단 순서를 생각한다는 것 자체가 넌센스이다. 왜냐? 인접리스트와 인접행렬 이라는 방법을 자체가 [루트노드]가 주어진 그래프를 나타내는 방법이 아니라, 단지 [노드]와 [노드]사이의 연결관계를 표현한 것이기 때문이다. ->즉, 리스트배열에 저장된 리스트요소들의 정렬순서는, dfs나 bf..

스프링 DI 공부 및 내가 실수했던 것들[최범균의 스프링5 책](2021-05-26)

DI(DIpendency Ingection)란 '의존주입' 이라고 불린다. 여기서 의존에 대한 정의를 알아야 하는데 의존은 클래스 안에서 다른 클래스를 실행할 때, 이를 의존한다고 표현한다. 다시 정확하게 설명하자면, 의존은 한 클래스의 변경에의해 필연적으로 영향을 받는 관계를 의미한다. 즉, 의존의 대상이되는 코드의 변경이 이루어졌을때, 의존하는 메서드에 기능적, 프로그래밍적 영향을 미치면, 그건 두 클래스가 의존관계에 있다고 말할수 있다. 스프링은 이런 클래스들간의 의존관계를 관리해주는 기능을 제공한다. 대표적으로 DI 이다. 스프링의 DI없이 의존관계를 주입하려면, 어떤 클래스가 다른 클래스를 의존할때, 의존이 필요한 클래스 안에서 의존의 대상이 되는 클래스의 객체를 생성하는 방법으로 클래스간 의존..

메이븐 프로젝트 POM.XML설정 및 코딩 오답.(최범균 스프링 5 프로그래밍 Chaptor 02, 2021,05,25)

우선, 스프링 프로젝트를 시작하기 위해서는 스프링의 객체를 생성해주고, 초기화해주는 종합적인 관리도구가 필요한데, 대표적으로, 메이븐,그레이들,엔트가 있다. 이 책에서는 메이븐으로 프로젝트를 시작하는 것을 다루고 있다. 우선 메이븐이나 그레이들이나 모두 동일한 폴더 구조를 사용한다. C:\spring5fs\sp5-chap02\src\main\java 구조로 이루어져 있음. 메이븐 으로 프로젝트를 만들기 위해서는 POM.XML이라는 파일을 프로젝트의 루트폴더에 두어야 한다. 이유는 모든 메이븐 프로젝트는 프로젝트의 루트폴더에 POM.XML 파일을 가지는데, 프로젝트에서 필요한 설정정보(그룹ID,스프링 버전)등을 마크업 언어로 작성한다. 그레이들은 build.gradle이라는 설정파일을 루트파일에 두어야한다..