Skip to content

Instantly share code, notes, and snippets.

@Curookie
Last active October 15, 2018 09:30
Show Gist options
  • Save Curookie/4ec76f17840bf68c95125f9ac1ef5c4d to your computer and use it in GitHub Desktop.
Save Curookie/4ec76f17840bf68c95125f9ac1ef5c4d to your computer and use it in GitHub Desktop.
Spring
JDK
JAVA
STS
Tomcat
설치 후 프로젝트 Lagucy 생성
com.inhatc.ws
문제 생길 시 user-> .m2 메이븐, .eclipse 이클립스, .p2 제거하면 됨
properties 에서 Project Facets ->java -> 1.8로
pom.xml 버전 정보 수정 1.8, 4.3.8 같은.. pom.xml 1.8 다 바꿔야한다.
pom.xml <!--Test--> 위에
http://perhapslove.net/Tmp/jstl.txt
들어가 내용 추가
Tomcat 서버 추가 Tomcat 환경설정에 \ws -> \로 변경
Project 오른쪽버튼 >> Maven >> Update ~~
이래도 안되면
Spring> Run As> Maven Clean..
Project >> SpringTool >> Update Maven Dependencies
-> 이거는 최후의 보루 (Project 오른쪽버튼 >> Maven >> Disable 둘다 해서 메이븐 없애고 위 작업 실행)
Apachi 기본포트가 8080이고 기본 STS 제공서버 포트도 8080이므로 catalina.properties 에 들어가서
포트를 8090이런식으로 변경하고 이후 프로젝트를 생성하면 에러나지 않는다.
MySQL 설치
jUnit기본만
@Test : 테스트해야 하는 내용
@Before : 모든 테스트 작업에 앞서 준비되어야 하는 내용
@After : 테스트 작업이 끝난 후 자동으로 실행하는 메소드에 추가하는 이노테이션
pom.xml에 Mysql 추가
<!-- mysql connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
pom.xml에 jUnit도 추가
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Spring은 메인과 테스트 영역을 따로 구분한다.
MyBatis 가 DB를 관리한다.
pom.xml에 추가
MyBatis
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- MyBatis-Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- Spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
root-context.xml - DB관련 모든 것
servlet-context.xml - 그 외 모든 것
root-context에 DB관련 정보입력과 namespace 체크 ( aop, context, jdbc, mybatic-spring(옵션), beans )
src/main/resources에 mybatis-config.xml 해보기
MVC 모델 Model, View, Controller
모델2 구조
모델: 데이터 혹은 데이터를 처리하는 영역을 의미합니다.
뷰: 결과 화면을 만들어 내는 데 사용하는 자원을 의미합니다.
컨트롤러: 웹의 요청을 처리하는 존재로 뷰와 모델 사이의 중간 통신 역할을 합니다.
User Controller Service DAO mabatis/mapper&DB
[ VIEW ]
Using Browser
request ----> (Get or Post)
Domain(URL)/main(URI)
main --------------> goth'f() ---> ------> 1.DB 연결
2.SQL
3.Data
reply veiw <--- main.jsp <---Data <--- get <---- <---- return
GET 방식은 조회할 때, POST 방식은 전송할 때 사용한다.
기초적인 controller 생성실습
String 리턴
만들어진 결과 전달
리다이렉트를 해야 하는 경우
JSON 데이터를 생성하는 경우
WAS없이 실행
@Controller 애노테이션 설정 -> 아이콘이 S가 붙는다.
@RequestMapping을 이용해서 특정한 URI경로에 해당하면 메소드가 실행되게 한다.
@ModelAtrribute 문자열 처리 할 수 있게
@ResponseBody 리턴 타입을 객체 처리할 때 사용
servlet-context.xml
안에 suffix이 .jsp이기에
return “??? ”시 ???.jsp파일을 찾아서 실행하게 된다.
파라미터에 변수 넣는 방법 URL 변수?=값
JSON 데이터 생성
pom.xml 파일에 추가
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>
@ResponseBody 애노테이션 추가
myBatics 중간고사
1. DB의 Table을 설계&작성
- MySQL로~
2. Domain 객체 (VO; Value Object) 생성
- src/main/java/com.inhatc.domain패키지 안에 ~VO.java 생성
3. DAO(Data Access Object)->DB의 Service/method 를 구현
- src/main/java/com.inhatc.persistence패키지 안에 ~DAO.java 넣기
4. SQL Query: mapper floder / xml으로 SQL을 작성. vo객체로 통신 mapper로 질의
- XML Mapper(Query만 따로 저장하는 것), src/main/resources/mappers폴더를 만들고 그 안에 넣기 ,select now(); 쿼리 현재시간 나옴 #{변수} 전달
5. root-context.xml 설정 변경 Mapper 모든 것 불러오기와 jUnit으로 테스트할 때 log4j추가하기(pom.xml에도 추가),캐시삭제를 위한 코드도
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/201344052"></property>
<property name="username" value="root"></property>
<property name="password" value="dnjs0191"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactroy" ref="sqlSessionFactory"></constructor-arg>
</bean>
6. 3.DAO에 대한 함수 구현 Implementation
7. root-context.xml에 <context:component-scan base-package="com.inhatc.persistence"></context:component-scan> 추가
8. src/test/java 에서 추가 테스트
CRUD의 게시판은 기본, 게시판만들기
- controller 가 함께 해야한다.
1. board 테이블 생성
2. 테스트를 위한 SQL 준비
insert into tbl_board (title, content, writer) values('제목입니다','내용입니다','user00');
select * from tbl_board where bno = 1;
select * from tbl_board where bno > 0 order by bno desc;
update tbl_board set title='수정된 제목' where bno = 1;
delete from tbl_board where bno = 1;
3. web.xml에 UTF-8 필터 추가
4. 프로젝트의 템플릿 적용
webapp/resources에 플러그인 추가한다.
webapp/WEB-INF/views에 include 폴더를 포함해서 템플릿폴더링크를 적용 footer header관한 jsp
5. home.jsp 변경
6. VO, DAO, DAOImpl, Mapper, DAOTest
7. 매번 import 안해도 되는 <TypeAliases> 적용, Mapper에 resultType="~ 요기가 생략 될 수 있게 됨"
ex) src/main/resources/mybatis-config.xml에 추가
<configuration>
<typeAliases>
<package name="com.inhatc.domain"/>
</typeAliases>
</configuration>
8. 컨트롤러가 소통할 Service, ServiceImpl 작성
9. root-context.xml 설정 서비스 자동으로 인식할 수 있도록 설정
10. controller 선언/ 만들기
11. Tomcat /controller -> / 로 바꾸기
12. 뷰의 구현과 URI 설계 (WEB-INF/views 밑에 board폴더 생성 그 안에 집어넣음) read.jsp, listAll.jsp, modify.jsp register.jsp 등등...
13. 예외 처리
post방식은 데이터가 가공이 될 때 / 서버에 전송할 때
get방식은 데이터를 제공 할 때
http://localhost:8080/board/register 는
User Controller Service DAO mabatis/mapper&DB
register(GET)
게시물 입력 ← register.jsp
------> register(POST) -> regist(with DATA) -> create(with DATA) -> create(with DATA)
success.jsp <- 완료 <- 완료 <---------------
return listAll
---> listAll(GET) ---> listAll()--> listAll()--> listAll
listAll(GET) <-----------------------------------------------
modify(GET) ----> read(bno)---> read(bno) --- > read
데이터 수정 <---modify.jsp <-------------------------------------------------
----> modify(POST) ---> modify(boardvo) -->update(~vo) --> update
return listAll <-----------------------------------------------
http 상태코드
form태그를 $("form[role='form']"); 로 표현 할수 있다.
예외처리
private ModelAndView errorModelAndView(Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/error_common");
modelAndView.addObject("exception", ex);
return modelAndView;
}
페이징 처리
- 보기 편하고, 데이터를 빠르게 보여주기 위해 페이지를 나누는 행위를 말한다.
- 필요한만큼, 빠르게결과
- URI고려해야 한다.
- 목록 페이지 하단에 페이지 번호를 보여주고, 클릭시 페이지가 이동하는 단계
- 다시 목록페이지로 돌아갈 수 있도록 처리하는 단계
1단계 : 페이지 번호, 몇개의 데이터를 보여줄것인가? 파라미터로 전달. 발취하기위한 쿼리 작성
2단계 : 목록페이지 하단에 정보를 보여주고, 이를 클릭하면 원하는 페이지로 이동하는 단계입니다. 다음 이전 처리 등 해야한다.
3단계 : 페이징 처리에서 목록 페이지에서 클릭을 통해 조회 수정후 다시 돌아오게하는 작업
GET 방식만 사용해야한다.
32게시물이 있다면 10개씩 보여주는 그럼 버튼 4까지만 나와야한다.
디비에 있는 데이터를 복제하는 SQL 방법~!!
insert into tbl_board(title, content, writer) (select title, content, writer from tbl_board);
DAO처리를 도와주는 Criteria 클래스 제작해야한다. 페이지 마다 띄어주는 수와 도어 넘버 보여주는 클래스
service와 controller listCri.jsp
User Controller Service DAO mabatis/mapper&DB
http://localhost:8080/board/listCri -> listCri(GET) -> listCriteria(Cri) -> listCriteria(Cri) -> listCriteria (with cri)
(+2 인자) (with criPage,
perPageNum)
List<BoardVO> <- List<BoardVO> <- List<BoardVO> <-
(view) ↓
listCri.jsp
Criteria란??
정렬
화면하단의 페이징 처리
- 우선 domain.에 PageMaker.java파일을 만들고
- BoardController에 RequestMapping 추가
- 그리고 listPage.jsp 뷰 수정 하단버튼들만들기
- BoardDAO 추가
- 그리고 Mapper로 가져올거 만들고
- BoardDAOImpl 수정 후
- Service 수정
- ServiceImpl도 마찬가지
- BoardController.java 수정 테스트용말고 리얼로
문제, page파라미터만 처리해서 perPageNum은 처리못함
해결책, javascript나 PageMaker에서 링크생성해주는 방식으로 해결가능하다.
UriComponentsBuilder 를 사용해서 Test할 수 있다.
목록페이지와 정보를 유지하기 위한 것은 BoardController 수정해서 Criteria Cri 정보를 갖고다니게 할 수 있다.
jsp페이지 변경된거 추가
수정,삭제 페이지 변경
검색처리와 동적 SQL
4가지, 콤보박스 검색창 검색버튼 newBoard버튼 구현 해야함
Criteria를 상속해서 SearchCriteria를 구현함.
Controller는 BoardController를 복사해서 그대로 쓰면 된다.
RequestMapping sboard로 바꾼다.
select option -> Switch문과 비슷하다.
검색조건 추가하기 콤보박스선택한거
get파라미터 추가되기 때문에 기존에 PageMaker를 바꿔야함.
listPage.jsp 를 복붙해서 list.jsp 해야한다.
검색버튼 -> makeQuery(1) 1페이지 띄워주기.
MyBatis의 동적SQL을 사용해서 검색조건마다 다르게 SQL문을 질의하게 설정.
DAO 수정 Mapper 수정
<include> 는 SQL을 함수처럼 만드는 것.
Service 수정
■ IoC(Inversion of Control) - 제어의 역전
간단하게 말하여 프로그램의 제어 흐름 구조가 바뀌는 것이다.
스프링의 핵심 개념 중 하나다.
기존에는 다음과 순서로 객체가 만들어지고 실행되어졌다.
1.객체 생성
2.의존성 객체 생성(클래스내부에서)
3.의존성 객체 메소드 호출
하지만, 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.
1.객체 생성
2.의존성 객체 주입(스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.)
3.의존성 객체 메소드 호출
스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며,
제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
■ DI (Dependency Injection) - 의존성 주입
IoC 구현 방법이다.
DI방식으로 코드를 작성한다면 현재 사용하고 있는 객체의 메서드가 어떻게 작성되었는지 알 필요가 없으며
솔직히 그 클래스가 기능을 잘 구현했는지 조차도 알 필요가 없다.
그저 당신이 확인할 사항은 클래스의 기능을 추상적으로 묶어둔 인터페이스만 갖다 쓰면 그만이다.
나머지는 스프링에서 찜한 걸 연결시켜줄테니 말이다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment