목표 xml 대신 Java 코드를 통해 설정파일을 작성한다. 기존 xml 설정 파일 작성방식 위와 같이 xml로 작성된 설정파일을 Java 코드로 만들면 아래와 같다. Java 코드로 작성한 설정 파일 @ComponentScan("spring.di.ui") @Configuration public class NewlecDIConfig { @Bean public Exam exam() { return new NewlecExam(); } } @Configuration : Java로 작성한 설정 파일임을 알림 @ComponentSacn("spring.di.ui") = @Bean public Exam exam(){return new NewlecExam()} = 으로 똑같이 작성할 수 있다. @Bean 어노테이션은 ..
뉴렉쳐 스프링 프레임워크 정리
목표 xml 대신 @Component 어노테이션을 사용하여 객체를 생성한다. (@Component = @Controller, @Service, @Repository) 기존 xml 객체 생성 방식 public class GridExamConsole implements ExamConsole { private Exam exam; ...(생략)... @Autowired @Override public void setExam(Exam exam) { this.exam=exam; } } 여기서 console이라는 id를 가진 Dependency를 어노테이션을 활용해 생성해보자. @Componet 어노테이션을 활용한 객체 생성 방식 //컴포넌트 이름 지정 안 해주면 Class 네임으로 IoC 컨테이너에서 가져와야 함 @..
목표 xml 대신 @Autowired 어노테이션을 사용하여 DI 하는 방법을 알아본다 기존 xml DI 방식 public class Program { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml"); ExamConsole console = (ExamConsole) context.getBean("console"); console.print(); } } exam과 console이라는 이름을 가진 객체를 DI하고, context 라는 IoC 컨테이너를 통해 해당 객체들을 가져와 사용한 모습이다. 어노테이션을 사용한 DI 방식 p..
목표 이전 시간에는 bean태그의 ref 속성을 이용하여 참조 형식의 속성에 값을 설정했었다. 이번엔 value 속성을 이용하여 값 형식의 속성에 값을 설정해보자. 또 생성자를 통한 DI 방법과 콜렉션 DI 방법에 대해 알아본다. 값 형식의 속성에 값 설정하기 public class NewlecExam implements Exam{ private int kor; private int eng; private int math; private int com; public NewlecExam() { } public NewlecExam(int kor, int eng, int math, int com) { this.kor = kor; this.eng = eng; this.math = math; this.com = ..
목표 public class GridExamConsole implements ExamConsole { private Exam exam; public GridExamConsole() { } public GridExamConsole(Exam exam) { this.exam = exam; } @Override public void setExam(Exam exam) { this.exam=exam; } } 위 코드에서 볼 수 있듯이, Exam 클래스는 GridExamConsole이라는 클래스에 종속되어 있다. 이 때, Spring을 쓰지 않았을 경우와 썻을 경우 어떻게 DI를 수행하는지 살펴보자. 그리고 IoC 컨테이너에서 DI한 객체를 사용해보자. Spring을 쓰지 않은 DI 방식 public class Pr..
DI(Dependency Injection)란? 종속성 주입으로, 사용자가 원하는 객체 내부의 값(객체 등)을 Setter나 생성자를 통해 설정해주는 것이다. Composition has a (일체형) class A { private B b; public A(){ b = new B(); } } B가 A 내부에서 정해진다. Association has a (조립형) class A { private B b; public A(){ } public void setB(B b){ this.b=b; } } B를 A 외부에서 setter를 통해 가져와 정한다. 이 때 조립형에서 DI를 설명할 수 있는데 B b = new B(); // Dependency - 부품 A a = new A(); a.setB(b); // In..
※GET / POST 방식을 구분하지 않고 코드를 작성할 때 발생하는 에러 위 list 목록 페이지에서 reg라는 글쓰기 페이지를 호출하려고 한다. reg라는 글쓰기 페이지는 아래 코드와 같이 files라는 객체를 사용한다. 그런데 페이지 호출시 files와 관련해 받은 내용이 없어 해당 객체는 null 값이 되고, 이로 인해 목록에서 글쓰기 페이지를 호출하면 500 오류가 발생한다. 1) reg 페이지 관련 Controller @RequestMapping("reg") @ResponseBody public String reg(MultipartFile[] files, HttpServletRequest request) throws IllegalStateException, IOException { for(Mu..
※ 파일 전송에서의 기본 인코딩 방식 서버와 클라이언트는 기본 인코딩 방식으로 application/x-www-form-urlencoded 을 사용한다. 이는 문자열만을 주고받는 방식으로 위 이미지에서 처럼 클라이언트가 uid를 newlec, name을 dragon으로 서버로 전송할 경우 uid=newlec&name=dragon로 문자열을 전송한다. 하지만 파일과 같은 바이너리 파일들은 이런 문자열 형태로는 전송하기가 어려운데, 이를 극복하기 위해 나온 것이 multipart/form-data 인코딩 방식이다. 위 이미지처럼 하나의 문자열이 아닌 각 name마다 데이터별 별개의 구분을 주어 전송한다. 따라서 우리가 서버를 작성할 때, 파일을 받기 위해서는 multipart/form-data 인코딩 방식의..
기존 페이지에서는 header, body, aside, footer 등의 다양한 파트들이 하나의 페이지에 작성되어 있었다. 하지만 여러 페이지에서 공통으로 쓰이는 부품들이 있을 때, 특정 내용을 수정하려면 모든 페이지의 같은 내용을 수정해야한다. 또한 재사용에도 번거롭다는 단점이 있다. 이를 해결하기 위해 나온 것이 지금 배울 Tiles 라이브러리로 header, body, aside, footer 등의 여러 부품들을 하나의 레이아웃 페이지에 붙여 공통된 형태를 하나의 페이지로 가질 수 있게 할 것이다. 현재는 Front-end에서 이 기법을 제공하기에 점점 사용이 줄어가고 있으나, 여전히 사용하는 곳이 있으니 알고있자. 아래 설명할 내용들은 위 과정을 거친다. 1) 클라이언트가 서버에 /notice/l..
1. 포인트 컷이란? AOP를 적용할 때 해당 객체의 모든 메소드에 적용하는 것이 아닌, 개발자가 원하는 특정 메소드만 AOP를 적용하는 것을 의미한다. 2. xml 설정 logBeforeAdvice와 logAroundAdvice로 AOP를 실행할 때, classicPointCut에 지정되어있는 total 메소드에만 AOP를 적용하여 실행한다는 의미이다. classicAroundAdvisor classicBeforeAdvisor logAfterReturningAdvice logAfterThrowingAdvice 따라서 proxy에 주입해주는 객체로 기존의 logAroundAdvice -> classicAroundAdvisor로 위에 생성한 객체를 주입해줘야한다. 그렇다면 앞으로 total 메소드에만 AO..