꼭.. Classpath에서 필요한 라이브러리 추가할 것
lib에도 추가해줄 것!
class Human{
public void Sing(){}
public void running(){}
public void Cook(){}
public void Study(){}
}
class Singer{
public void sing(){}
}
class Student{
public void study(){}
}
public interface Bird{
public void fly(){}
}
public class Eagle implements Bird{ //Eagle is A Bird
public void fly(){}
}
public class Tiger implements Bird{ //IS-A원칙 위반
public void fly(){}
}
💡 프레임워크는 말 그대로 뼈대나 근간을 이루는 코드들의 묶음으로 개발자 능력에 따라 결과 역시 큰 차이를 낳는데 이런상황을 극복하기 위해 나온 것이 프레임워크다. 프레임워크를 이용한다는 것은 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식
💡 2000년대 초반부터 시작된 엔터프라이즈급의 개발은 안정된 품질의 개발이 절실했고, 그 결과 많은 프레임워크의 전성시대
복잡함에 반기를 들어서 만들어진 프레임워크
로 일반적으로 java클래스와 인터페이스를 이용하는 구조이기 때문에 진입장벽이 높지 않았기 때문이다.프로젝트의 전체 구조를 설계할 때 유용한 프레임워크
로 스프링은 어느 한 분야에 집중하지 않고, 전체를 설계하는 용도로 사용하며 근본적인 사상 자체가 OOP 구조를 뒷받침하고 구조를 설계하는 사상다른 프레임워크들의 포용
으로 다른 프레임워크들은 특정 프레임워크를 채택하면 해당 영역 전체를 수정해야 하는 고질적인 문제가 있으나, 스프링은 다른 프레임워크들과의 통합 지원했기 때문에 최소한의 수정이 가능했다. 스프링의 최대 장점은 기본 뼈대가 흔들지 않고 여러 종류의 프레임워크 혼용해서 사용 가능개발 생산성과 개발도구의 지원
으로 플러그인도 빠른 업데이트 되었기에 별도의 개발도구에 적응 없이도 개발 가능ApplicationContext
라는 존재가 필요한 객체 생성하고 필요한 객체 주입시켜줌ApplicationContext
이 관리하는 객체는 빈(bean)이라고 부름객체 간의 관계
를 구성할 수 있는 특징을 지님외부(스프링 컨테이너)에서 생성 한 후 주입
시켜주는 방식스프링(Spring) 프레임워크 기본 개념 강좌 (2) - 주요 구성 요소 & DI
New 생성자
를 통해서 직접 생성하는 방법setter()
를 통해서 사용하는 방법외부(컨테이너)에서 결정
된다.생성
( 클래스 내부에서 생성)class JDBConnection{
public JDBConnection(){
con;
}
}
class MemberDAO(){
MemberDAO(){
JDBConnection connect = new JDBConnection();
con = connect.getConnection();
}
}
주입
setter
를 이용해서 값을 주입시 사용<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
<property name="name">
<value>홍길동</value>
</property>
<property name="age">
<value>20</value>
</property>
</bean>
</beans>
실제 값
을 가지고 있는 PersonServiceImplpackage com.spring.ex01;
public class PersonServiceImpl implements PersonService {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void sayHello() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
package com.spring.ex01;
public interface PersonService {
public void sayHello();
}
껍데기[메소드]만
알 수 있음package com.spring.ex01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class PersonTest {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
PersonService person = (PersonService) factory.getBean("personService");
// PersonService person = new PersonServiceImpl();
person.sayHello();
}
}
생성자
를 이용해 값을 주입할 때 사용<bean>
이 컨테이너 풀<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="personService1" class="com.spring.ex01.PersonServiceImpl">
<constructor-arg value="아이유" />
</bean>
<bean id="personService2" class="com.spring.ex01.PersonServiceImpl">
<constructor-arg value="손흥민" />
<constructor-arg value="24" />
</bean>
</beans>
package com.spring.ex01;
public class PersonServiceImpl implements PersonService {
private String name;
private int age;
public PersonServiceImpl() {}
public PersonServiceImpl(String name) {
this.name = name;
}
public PersonServiceImpl(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public void sayHello() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
package com.spring.ex01;
public interface PersonService {
public void sayHello();
}
package com.spring.ex01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class PersonTest2 {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
PersonService person1 = (PersonService) factory.getBean("personService1");
person1.sayHello();
PersonService person2 = (PersonService) factory.getBean("personService2");
person2.sayHello();
// 빈을 프로그래머가 만드는 것이 아닌 모든 빈의 운영권을 컨테이너에게 위임
}
}
package com.spring.ex02;
public interface MemberDAO {
public void listMembers();
}
package com.spring.ex02;
public class MemberDAOImpl implements MemberDAO{
@Override
public void listMembers() {
System.out.println("listMembers 메소드 호출");
System.out.println("회원의 정보를 조회합니다.");
}
}
package com.spring.ex02;
public interface MemberService {
public void listMembers();
}
package com.spring.ex02;
public class MemberServiceImpl implements MemberService{ //MemberService 구현
private MemberDAO memberDAO; //property name : memberDAO, 주입되는 빈을 저장할 memberDAO 타입의 속성 선언
public void setMemberDAO(MemberDAO memberDAO) {
this.memberDAO = memberDAO; //설정파일에서 memberDAO 빈을 생성한 후 setter 속성 memberDAO 주입
}
@Override
public void listMembers() {
memberDAO.listMembers();
}
}
package com.spring.ex02;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class MemberTest1 {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("member.xml"));
MemberService service = (MemberService) factory.getBean("memberService");
service.listMembers();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!-- 관계도를 등록한 것 -->
<!-- MemberSeviceImpl클래스를 이용하여 id가 "memberService"인 빈을 생성 -->
<bean id="memberService" class="com.spring.ex02.MemberServiceImpl">
<!-- 빈을 만들면서 setter 주입방식으로 id가 "memberDAO"인 빈을 자신의 속성에 주입한다. -->
<property name="memberDAO" ref="memberDAO" /> <!-- 포넌트 멤버 서비스 -->
</bean>
<!-- id가 "memberDAO"인 빈을 MemberDAOImpl을 이용해서 생성 -->
<bean id="memberDAO" class="com.spring.ex02.MemberDAOImpl" /> <!-- 꽂아주기 -->
</beans>
<!-- 의존하는 빈을 주입할 때는 주입되는 타입이 기본형데이터가 아닌 참조형 데이터일 경우 ref 속성을 이용해서 주입해야 한다. -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!-- 동작 순서대로 작성하나 초기화 시점을 조정 가능 -->
<bean id="firstBean" class="com.spring.ex03.First" lazy-init="false" />
<bean id="secondBean" class="com.spring.ex03.Second" lazy-init="true" />
<bean id="thirdBean" class="com.spring.ex03.Third" lazy-init="default" />
</beans>
package com.spring.ex03;
public class First {
public First() {
System.out.println("First 생성자 호출");
}
}
package com.spring.ex03;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class LazyTest {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("lazy.xml");
System.out.println("SecondBean 얻기");
context.getBean("secondBean");
}
}
<bean id="secondBean" class="com.spring.ex03.Second" lazy-init="true" />
<bean id="firstBean" class="com.spring.ex03.First" lazy-init="false" />
AOP(Aspect-Oriented Programming)
용어 | 설명 |
---|---|
aspect | 구현하고자 하는 보조 기능을 의미합니다. |
advice[2] | aspect의 실제 구현체(클래스)를 의미 |
메서드 호출을 기준으로 여러 지점에서 실행됩니다. | |
joinpoint[4] | advice를 적용하는 지점을 의미 |
스프링은 method 결합점만 제공합니다 | |
pointcut[3] | advice가 적용되는 대상을 지정 |
패키지이름/클래스이름/메서드이름을 정규식으로 지정하
여 사용 |
| target[1] | advice가 적용되는 클래스를 의미합니다. |
| weaving | advice를 주기능에 적용하는 것을 의미합니다. |
@Aspect
애너테이션을 이용하는 방법그 후에 라이브러리 넣어주면 됨!!
오늘은 인텔리제이깔고 스프링했다. 인텔리제이가 내가 예전에 많이 쓴 안드로이드 프로그래밍이랑 비슷해서 반가웠다.
전에도 깔짝 만져보긴 했는데...이제는 이클립트에서 벗어나서 인텔리제이로 인텔제이로 다양한 툴을 만져보는 게 좋다고 한다. 이것저것 만져봐야지 오늘은 끝나고 cs 기술 면접 대비 스터디 진행했다. 내가 만든 노션 템플릿으로 진행!!! 발표 후 방향성에 대해서도 서로 대화를 나눴다.
일주일에 한 번씩 만나 발표하고 질문도 만들어오기로 했다. 며칠 공부한다고 늦게 잤더니 너무 피곤하다 내일 강의를 위해 오늘은 일찍 자자...