왜 get 안쓰지?'
컴포넌트는 방대한개념
controller repository service
@repository
-->dao
autowrite
(지시서를 통해) 만들어라
컴포넌트에 있으면 지시서 필요없는데 컴포넌트에 없으면 지시서가 필요
c태그가먼저 읽힘 그다음 jsp
#은 dto에있는거를 가져옴
1. web xml -> 한글 필터
2. pom.xml -> 라이브러리 추가
3. root-context.xml -> 데이터 설정 (namespace에서 context 체크하기)
4. config, mapper, mybatis-config.xml만들기
4. model, controller만들기
5. board.xml에서 namespace확인
😀 인터페이스를 이용한 DI(Dependency Injection)-의존성주입 방법 2가지
// 1. 인자 생성자를 이용하여 주입.
ServiceImpl impl = new ServiceImpl(new DD());
impl.biz();
// 2. setter() 메서드를 이용하여 주입.
ServiceImpl impl2 = new ServiceImpl();
impl2.setService(new CC());
impl2.biz();
😀라이브러리가 안되는 경우
spring을 닫고 -> user폴더에서 .m2 폴더를 삭제 -> 그리고 spring 다시 키면 라이브러리 받아옴
😀lombok
설치 다 한다음에
@(애노테이션)data를 입력하면 outline에 추가됨
😀XML을 이용할 때는 src/main/resources를 이용해야함 - new - spring Bean configuration
.😀
@data -> getter/setter메서드
@NoArgsConstructor -> 기본생성자 (파라미더가 없는 생성자)
@AllArgsConstructior -> 인자생성자
/*
* AbstractApplicationContext 객체가 DI 작업을 해 주는 스프링 컨테이너
* xml 파일을 이용하여 메모리로 해당 xml 파일이 로딩이 됨.
*/
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:getsum.xml");
MyGetSum mysum = (MyGetSum)ctx.getBean("mySum");
mysum.sum();
# 스프링 개요
- 선수 학습 :
- 개념 : 자바 언어를 기반으로 한 애플리케이션을 제작할 때 효율적으로
빠르게 개발할 수 있도록 하는 애플리케이션 프레임워크
(프로그래밍 툴).
# EJB(Enterprise Java Beans)
- Java Beans 이란 자바 객체를 재사용 가능하도록, 컴포넌트화 시킬
수 있는 코딩 방침을 정의한 것, 즉, 쉽게 말하면 bean은 객체라고
이해하면 됨.
- EJB 엔터프라이즈급 애플리케이션 개발을 단순화하기 위해 발표된 스펙임.
개발을 하다 보면 많은 객체들을 만들게 되는데, 이러한 비지니스 객체
들을 관리하는 컨테이너를 만들어서 필요할 때마다 컨테이너로부터 객체를
받는 식으로 관리를 하면 효율적일것 같다 라는 데서 착안하여 탄생함.
- 이러한 취지는 좋았지만, 서비스가 구현해야 하는 실제 비지니스 로직
보다 EJB 컨테이너를 사용하기 위한 상투적인 코드(상속 and 구현
해야 하는 클래스)들이 많다는 불편함이 있게 됨. 당연히 작성된
코드는 EJB 컨테이너가 없다면 사용할 수 없게 됨.
- 특히 심각했던 것 중에 하나가 벤더 사마다 EJB 컨테이너를 구현한
내용이 다르기 때문에 다른 벤더 사의 컨테이너로의 변경에 어려움이
있고, 이로 인해 다른 벤터 사의 컨테이너로 변경 시 설정이 너무
복잡하다는 문제가 생기기 시작함.
- EJB 컨테이너로부터 필요한 객체를 꺼내 사용하는 방식으로 객체들
간의 의존성을 해결하려는 것이었지만 비지니스 로직에 특정 기술이
종속되는 것이 가장 큰 문제였음.
- 이에 2002년 로드 존슨이 특정 클래스를 상속하거나 인터페이스를
구현하지 않는 평범한 자바 클래스(POJO : Plain Old Java Object)
느슨한 Java Bean 을 이용하여 단순하지만 EJB에서 제공하는 고급
기술을 제공하는 스프링을 창시하게 됨.
# 객체지향 프로그래밍
- 객체지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서
벗어나 여러 개의 독립된 단위, 즉 "객체" 들의 모임으로 파악하고자 하는 것임.
각각의 객체는 메세지를 주고 받을 수 있고, 데이터를 처리할 수 있음(협력)
- 객체지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에
대규모 소프트웨어 개발에 많이 사용이 됨.
* 유연하고 변경이 용이하다는 의미.
- 레고 블럭을 조립하듯이
- 키보드, 마우스 갈아 끼우듯이
- 컴퓨터 부품 갈아 끼우듯이
- 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
==> 다형성(Polymorphism)
# 스프링 프레임워크란?
- 스프링은 엔터프라이즈(기업용) 애플리케이션에서 필요로 하는 여러가지
기능들을 제공하는 프레임워크.
- Java EE가 제공하는 기능들을 스프링에서도 지원하고 있게 때문에
국내에서 가장 인기 있는 프레임워크로 자리를 잡았음.
- 스프링은 Java EE에서 제공하는 기능 외에 DI나 AOP 같은 기능
들을 추가적으로 제공함.
- Java EE에서 MVC-2 모델 방식도 새로운 애플리케이션을 개발할
때마다 일일이 처음부터 하나씩 다시 개발해야 하는 단점이 있음.
모든 애플리케이션에서 공통적인 기능들을 처음부터 다시 개발해야
한다는 것은 상당히 비효율적임.
- 이보다 더 좋은 방법은 없는 것일까?? 있다.... 스프링이다.
애플리케이션 개발 시에 일반적인 웹 애플리케이션에서 많이 사용하는
기능들은 미리 만들어서 제공을 하고, 그 외의 필요한 부분만 추가
및 수정하는 방식을 이용하면 됨. 이렇게 하면 훨씬 효율적일 뿐만
아니라 일정한 형식에 따라서 개발을 진행하므로 표준화가 이루어져
생산성도 높일 수 있음.
- 애플리케이션은 규모가 커질수록 각각의 기능들을 개발자가 따로
개발하는 것보다는 표준화된 방법으로 개발하는 것이 상당히 유리함.
- 그렇다면 프레임워크(framework)란?
프레임워크(framework)의 사전적 의미는 "어떤 것을 구성하는 구조
또는 뼈대"라는 뜻을 가지고 있음.
소프트웨어적인 의미로는 "기능을 미리 클래스나 인터페이스 등으로
만들어 제공하는 반제품" 정도로 해석을 할 수 있음. 즉, 어느 정도는
완성된 상태로 제공되는 기능을 말함.
# 스프링 프레임워크의 특징.
- 스프링은 경량의 프레임워크.
* 자바의 객체를 담고 있는 컨테이너(IoC 컨테이너).
* 객체의 생성, 관리, 소멸과 같은 생명 주기를 관리함.
- 스프링은 유지보수가 용이함.
- 스프링은 개발 기간을 효율적으로 단축할 수 있음.
# DI(Dependency Injection : 의존성 주입)
- DI 는 스프링 핵심 개념 중 하나임.
- 기존에는 어떤 클래스가 다른 클래스의 기능(메서드)을 사용하려면
당연히 개발자가 코드에서 직접적으로 사용할 클래스의 생성자를
호출해서 사용을 하였음(new 키워드를 이용).
따라서 사용할 클래스와 사용될 클래스의 관계는 개발자에 의해 직접
코드에서 부여가 되었음.(의존도가 높음 - 강한 결합)
- 스프링에서는 객체 사이의 의존 관계를 객체 자신이 아닌 외부(스프링
컨테이너)에서 수행하는 개념임.
즉, 이런 연관 관계를 개발자가 직접 코딩을 통해서 부여하는 것이
아니라 스프링 컨테이너가 연관 관계를 직접 규정하는 것을 말함.
그러면 코드에서 직접적인 연관 관계가 발생하지 않으므로 각각의
클래스들의 변경이 자유로와짐(약한 결합).
따라서 스프링 프레임워크에서는 각 클래스들의 연관 관계를 클래스들
간의 사이에서 맺어지는 것이 아니라, 스프링 프레임워크에서 설정을
통해 맺어줌으로써 클래스들끼리의 연관 관계를 맺지 않도록 구현을
해 놓았음.
- 스프링 프레임워크에서 의존 관계 설정은 설정 파일(bean.xml)이나
애노테이션을 이용하여 설정을 함.
- 스프링에서 클래스(빈 : bean)를 담는 그릇을 컨테이너라고 함.
스프링 기반 애플리케이션에서는 스프링 컨테이너에서 객체가 태어나고,
자라고 소멸을 함. 스프링 컨테이너는 객체를 생성하고, 서로 엮어
주고 하는 전체적인 생명 주기를 관리함.
스프링 컨테이너는 스프링 프레임워크 핵심부에 위치함. 스프링 컨테
이너는 종속 객체 주입을 이용해서 애플리케이션을 구성하는 컴포넌트
를 관리하며, 협력 컴포넌트 간 연관 관계의 형성도 스프링 컨테이너
에서 이루어짐.
# DI(의존성 주입) 하는 방법 - 2가지
- setter(설정 메서드) 메서드를 이용하는 주입 방법.
- constructor(인자 생성자)를 이용하는 주입 방법.
* 의존 관계를 설정하는 방법
- XML 파일을 이용하여 의존 관계 설정.
- Java 코드를 이용하여 의존 관계 설정. - 애노테이션을 이용.
- XML 과 Java 를 혼용해서 의존 관계 설정.
/*
* - 스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고,
* 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)
* 라고 부름.
* - 객체의 생성과 객체 사이의 런타임 관계를 DI 관점에서 볼 때
* 컨테이너를 BeanFactory라고 함.
* - 스프링은 객체를 생성하고 각각의 객체를 연결해 주는 조립기 역할을
* 함.
* - 여기에 있는 GenericXmlApplicationContext 객체가 조립기
* 기능을 구현한 클래스임.
* - 조립기에서 생성할 객체가 무엇이고, 각 객체를 어떻게 연결하는지에
* 대한 정보는 xml 파일에 설정이 되어 있음.
* - GenericXmlApplicationContext 객체는 이 xml 파일에
* 정의된 설정 정보를 읽어 와서 객체를 생성하고, 각각의 객체를
* 연결한 뒤에 내부적으로 보관을 함.
* - xml을 이용한 스프링 설정을 하다 보면 컨테이너가 생성할 객체를
* 지정하기 위해 <bean> 태그를 사용하게 됨.
* - 스프링 컨테이너가 생성해서 보관하는 객체를 스프링 빈(spring
* bean) 객체라고 부르며, 일반적으로 자바 객체와 동일함.
* - 스프링 컨테이너는 생성한 빈 객체를 <이름, 빈 객체> 이렇게
* 쌍으로 보관을 함.
* - 스프링 컨테이너가 보관하고 있는 객체를 이용하고 싶은 경우 빈
* 객체와 연결되어 있는 이름을 이용해서 객체를 참조하게 됨.
*/
/*
* 스프링 컨테이너의 종류
* - BeanFactory : BeanFactory 계열의 인터페이스만 구현한
* 클래스는 단순히 스프링 컨테이너에서 객체를 생성하고
* DI만 처리해 주는 기능만을 제공해 주는 객체.
* * Bean을 등록, 생성, 조회, 반환 관리를 함.
* * BeanFactory는 빈을 생성하고 분배하는 책임을
* 지는 클래스.
* * Bean을 조회할 수 있는 getBean() 메소드가
* 정의되어 있음.
* * 보통은 BeanFactory를 바로 사용하지 않고, 이를
* 확장한 ApplicationContext를 사용함.
* 하지만 스프링을 사용하는 이유는 단순히 DI만
* 사용하기 위함이 아닌 스프링을 사용하는 다양한
* 부가 기능(트랜잭션 처리, 자바 코드 기반의 스프링
* 설정, 애노테이션을 이용한 빈 설정, 스프링을
* 이용한 웹 개발 등등) 때문인데 이러한 부가 기능을
* 사용하기 위해서는 ApplicationContext 객체를
* 주로 사용하게 됨.
* - ApplicationContext : Bean을 등록, 생성, 조회, 반환 관리하는
* 기능은 BeanFactory와 같음.
* 스프링의 각종 부가 기능을 추가로 제공함.
* - AbstractApplicationContext : 컨테이너 종료(close)와 같은
* 기능을 제공해 주는 객체.
* - GenericXmlApplicationContext : AbstractApplicationContext
* 객체를 상속을 받아서 만들어진 클래스로써 xml
* 파일에서 스프링 빈 설정 정보를 읽어오는 역할을 함.
* GemericXmlApplicationContext 객체를 생성
* 할 때 파라미터 값으로 "classpath:mydao.xml"
* 을 전달했는데 이는 클래스 패스에 위치한 xml
* 파일을 설정 파일로 사용한다는 의미임.
* - GenericXmlApplicationContext 객체는 전달받은 xml 파일
* 에서 설정 정보를 읽어와서 스프링 빈 객체를 생성
* 하고 프로퍼티 값을 설정해 줌. 이렇게 생성된 빈
* 객체는 getBean() 이라는 메서드를 사용해서
* 구현을 할 수 있음. getBean() 메서드의 첫번째
* 파라미터는 구현하고자 하는 스프링 빈 객체의
* 고유한 id 이름이며, 두번째 파라미터는 그 객체의
* 클래스 타입을 의미함.
*/
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
23.05.02
<!--
bean 태그의 속성 설명
- class : bean(객체)의 클래스 이름 - 패키지명 포함
- id : bean(객체)의 고유 식별자
- property 태그
==> bean(깩체) 생성 시 setter() 메서드에 전달할 인수(인자)
- constructor-arg 태그
==> bean(객체) 생성 시 인자 생성자에 전달할 인수(인자)
-->
ex1)
<bean id="exam" class="com.spring.di03.Exam">
<!-- 인자 생성자를 이용하여 주입하는 방법 -->
<constructor-arg value="안녕하세요 스프링에 오신걸 환영합니다!" />
</bean>
ex2)
<bean id="person1" class="com.spring.di04.Person">
<constructor-arg value="홍길동" />
<constructor-arg value="941212-1234567" />
<constructor-arg value="남자" />
<constructor-arg value="27" /> <!-- 숫자도 " " 붙여야함 -->
</bean>
<!-- 인자생성자는 하나의 인자생성자가있을때만 사용가능 , 2개이상의 인자생성자가 있으면 property를 사용해야함! -->
클래스에 @data만 있으면 인자생성자가 없어서 xml에서 constructor-arg 못쓰고 property만 쓸 수 있음
// keySet() : Map에 있는 키를 전부 다 가져오는 메서드
Set<Integer> set = map.keySet();
for(Integer k : set) {
System.out.println(map.get(k));
<map>
<entry>
<key> <value>1</value></key>
<value>짜장면</value>
</entry>
<entry>
<key> <value>2</value> </key>
<value>짬뽕</value>
</entry>
</map>
/*
* DI 설정 시 Java 코드에서 애노테이션을 설정하여 주입하는 방법
*
* - @Configuration, @Bean 애노테이션을 사용함
*
* - @Configuration : 클래스 앞에 선언하는 애노테이션
* "해당 클래스는 스프링 설정에 사용되는 클래스입니다"라고 알려주는 애노테이션
* - @Bean : 메서드 앞에 선언하는 애노테이션
* "해당 메서드는 객체를 생성하는데 사용"된다는 의미
*
* - 애노테이션의 역할
* * 컴파일러에게 정보를 알려주는 역할
* * 컴파일 할 때와 설치 시의 작업을 지정하는 역할
* * 실행할 때에 별도의 처리가 필요한 경우 사용되는 역할
*
* - 주의 : 설정 시에 반드시 cglib 라는 라이브러리가 필요함
* ==> pom.xml 파일에 라이브러리를 추가해 주어야 함
*/
@Configuration
public class Config {
@Bean
public Player player1() {
ArrayList<String> position = new ArrayList<String>();
position.add("4번타자");
position.add("1루수");
Player player = new Player("추신수", 38, position, 100, 188);
return player;
}
}
/*
* AnnotationConfigApplicationContext
* - 자바 기반 설정 클래스에서 스프링 애플리케이션 컨텍스트를 로드할 때 사용이 됨
* - 자바 설정에서 정보를 읽어 와 빈(Bean) 객체를 생성 , 관리함
*/
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
<!--
네임스페이스 : <property>태그나 <constructor-arg>태그를 사용하다 보면
작성해야할 xml 문서의 내용이 전반적으로 증가를 하게 됨.
이것을 좀 더 짧게 작성하게 해 주는 것이 네임스페이스임
- 속성(setter) 주입 시에는 p라는 네임스페이스를 사용함
형식) p:매개변수이름="값" 또는
p:매개변수이름-ref="참조할 bean 태그의 id(식별자)"
- 인자생성자 주입 시에는 c라는 네임스페이스를 사용함
형식) c:매개변수이름="값" 또는
c:매개변수이름-ref="참조할 bean 태그의 id(식별자)"
-->
namespace에서 c와 p에 체크하고 사용하면 됨
ex)
<bean id="team" class="com.spring.di06.BaseballTeam"
c:manager="김경문" c:battingCoach="이승엽" c:pitcherCoach="선동렬" c:hitter="양의지" c:pitcher="양현종">
.😀두개 xml을 쓸 때는 콤마로 이어주면 됨
AbstractApplicationContext ctx
= new GenericXmlApplicationContext("classpath:baseball.xml", "classpath:baseball2.xml");
<!--
<context:annotation-config>
: 해당 태그는 특정 패키지 안에 있는 클래스 중에서
@Configuration, @Bean, @Autowired, @Resource 애노테이션이 존재를 하면
해당 애노테이션을 인식할 수 있도록 만들어 주는 태그
-->
ex) <context:annotation-config />
😀MVC
http://all-record.tistory.com/165 참고!!!!!
/*
* 스프링 MVC에서 Model(모델)이란?
* - 컨트롤러에 의해서 비지니스 로직이 수행이 되고 나면
* 대체적으로 view page에 보내질 정보들이 만들어짐
* 이러한 정보들을 스프링에서 Model(모델)이라고 한다.
* 이 Model(모델) 정보를 view page로 보내게 됨
*/
1. web.xml 한글처리작업
2. pom.xml에서 라이브러리 추가
3. servlet-context의 base-package 수정
4. root-context.xml 에서 db파일 설정
root-context.xml에서 설정에 따라 만들어야하는 패키지는 src/main/resources에서 만든다
# JDBC(Java DataBase Connectivity)
- JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API임.
- JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을
제공함.
- JDBC API의 문제점.
1. 쿼리를 실행하기 전과 후에 많은 양의 코드를 작성해야 함.
예) 오라클 드라이버 로딩, DB와 연결 생성, 명령문(쿼리문),
ResultSet 객체 연결, 연결 객체 닫기 등등
2. 데이터베이스 로직에서 예외 처리 코드를 수행해야 함.
3. 1과 2의 코드를 메소드 호출 시 마다 반복적으로 작성해야 함.
# Spring JDBCTempate?
- JDBCTemplate 은 Spring JDBC 접근 방법 중 하나임.
- 내부적으로 JDBC API를 사용하지만, 위의 내용과 같은 문제점을
제거한 형태로 Spring에서 제공하는 클래스임.
※ Spring JDBC가 하는 일.
- Connection 열기와 닫기.
- PreparedStatement 준비와 닫기.
- PreparedStatement 실행.
- ResultSet Loop 처리.
- Exception(예외) 처리.
- Transaction 처리
- Spring JDBC에서 개발자가 할 일은 핵심적으로 해야 할 작업만
해 주면 나머지는 Spring Framework에서 알아서 처리를 해 줌.
# DataSource?
- DataSource 는 JDBC 명세서의 일부분이면서 일반적으로 DB 연결 공장.
즉, DB와 관련된 Connection(DBCP 방식) 정보를 담고 있음.
* DB 종류(oracle.jdbc.driver.OracleDriver)
* url 정보(jdbc:oracle:thin:@localhost:1521:XE)
* 계정 정보(web)
* 계정 비밀번호 정보(1234)
# Spring JDBCTemplate 클래스를 사용하기 위해서는 pom.xml 파일에
아래와 같은 라이브러리를 추가해 주어야 함.
* spring-jdbc 라이브러리
* commons-dbcp 라이브러리
<!--
DTD(Document Type Definition)
- 작성한 문서가 어떤 문서인지에 대해서 정의해 놓은 것.
- 하나의 시스템 내에서 사용할 XML 데이터의 구조를 정의하여
유효성을 점검 시 사용하는 태그.
-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 명은 패키지명을 포함해서 DAO 인터페이스 이름으로
작성하는 것이 관례임.
namespace 명은 mapper 들을 구분하는데 식별자로 사용이 됨.
-->
.😀<![CDATA[쿼리문]]>
쿼리문을 작성할 때 조건식 기호(>, <, &)를 사용해야 하는데 XML에서는 이러한 기호들을 쿼리문의 조건식 기호로 인식하는 것이 아니라 태그로 인식하는 경우가 발생함.
이런 경우에는 에러가 발생함. 따라서 조건식 기호들을 단순한 문자열로 인식을 시켜주어야 함.
댓글