Spring 스프링
- 자바 기반 오픈소스 애플리케이션 프레임워크
📌 핵심기능
IoC(Inversion of Control)
- 객체 생성과 관리의 제어권을 개발자가 아닌 프레임워크가 가지며 객체 간의 의존성을 완화시키는 것을 의미한다.
DI(Dependency Injection)
- loC를 기반으로 객체 간의 의존성을 자동으로 주입하는 것
0. DB연결 (mySQL)
- target파일의 pom.xml에서 mysql라이브러리를 추가하는 코드를 작성한다
- <dependencies> 태그 안에 아래 코드 작성 후 Maven Dependencies에서 라이브러리 추가된 것을 확인
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
1 . Mapper
(src/main/resources 파일 - mapper패키지)
- XML파일로 생성하며 SQL을 저장하는 공간이다.
<mapper namespace="com.example.mapper.CommentsMapper">
//SQL문 작성
</mapper>
1) namespace 지정
- 매퍼 인터페이스와 SQL쿼리 파일을 연결하는 역할을 하며 명확한 메서드 호출 및 SQL쿼리 매핑에 중요한 역할을 한다
** 동일 메서드명을 사용하더라도 네임스페이스가 다르면 다른 메서드로 인식됨
2) SQL 태그
- 각각의 태그에는 id를 지정해 주며 DAOImplements에서 해당되는 sql의 DML구문을 실행할 수 있다.
- 해당 태그 안에는 각각의 타입에 맞는 sql문을 작성한다.
- 변수는 #{변수}로 담아 사용한다.
종류 | 예시 |
<select> | * 결과를 반환하는 select는 태그 안에 resultType속성을 필수로 사용한다. 값에는 "타입"을 넣어줌 <select id="list" resultType="hashmap"> select * from posts order by id desc limit #{start},#{size} </select> |
<insert> | <insert id="insert"> insert into posts(title,body,writer) values(#{title},#{body},#{writer}); </insert> |
<update> | <update id="update"> update posts set title=#{title}, body=#{body}, date=now() where id = #{id} </update> |
<delete> | <delete id="delete"> delete from posts where id = #{id} </delete> |
※ hashmap 타입
- 키와 값으로 이루어진 데이터 저장 자료구조로 다양한 데이터 형식을 저장할 수 있고 null값을 허용한다.
- 데이터 삽입, 삭제, 검색 등의 연산이 빠르고 대용량 데이터 처리에도 효율적이다.
- DB의 데이터를 가져올때 조회 결과를 HashMap을 이용해 메모리에 캐싱할 수 있어 VO를 따로 만들지 않아도 되어 편리함.
- Java에서 사용할 때는 HashMap<String,Object>로 타입을 지정한다 - 키, 값
2. VO (value object)
src/main/java파일 - com.example.domain 패키지)
- 자바 클래스로 생성하며 Getter, Setter메서드를 생성한다.
- 값을 담아주는 용도로 사용하며 DB의 컬럼명과 필드명을 동일하게 작성하는 것이 좋다.
3. DAO (data access object)
(src/main/java파일 - com.example.dao 패키지)
- Java의 인터페이스로 생성하며 DB와 연동하는 코드를 담당한다.
public interface ReviewDAO {
public List<HashMap<String,Object>> list(int code);
}
- 메소드의 형태만 지정해 주기 때문에 중괄호 열지 X
** 배열 타입은 ArrayList가 아닌 List로 사용한다.
4. DAOImplement
(src/main/java파일 - com.example.dao 패키지)
- DAO에서 정의한 메서드를 구현하기 위한 클래스
@Repository
public class CommentsDAOImpl implements CommentsDAO{
@Autowired
SqlSession session;
String namespace="com.example.mapper.CommentsMapper";
1) @Repository 지정
- 스프링 컨테이너에 빈으로 등록하여 DAO의 메서드를 다른 클래스(컨트롤러)에서 사용할 수 있도록 해준다.
2) implements 지정
- 구현할 DAO를 클래스명 뒤에 작성해 준다.
3) @Autowired로 주입
- 의존성 주입(DI) 기능을 사용하기 위한 선언으로 빈으로 등록된 클래스의 메서드를 호출하여 사용할 수 있도록 해준다.
Sqlsession | MyBatis에서 제공하는 DB연동을 위한 객체로 DB연결 및 실행 역할을 한다. |
namespace | Mapper파일에서 사용되는 네임스페이스로 SQL실행시 사용될 mapper파일 경로를 설정한다. |
※DAO와 Impl을 분리하는 이유
- 코드 변경이 필요한 경우 DAOImpl의 코드만 변경하면 되어 유지보수성이 높아진다. (코드 변경 범위 최소화)
- DAO인터페이스와 DAOImple의 구현 클래스를 분리하여 유연성을 높일 수 있다.
- Impl은 DB와 연동되지 않아도 Mock객체로 테스트할 수 있기 때문에 테스트 용이성을 높인다.
5. Controller
(src/main/java파일 - com.example.controller 패키지)
- JAVA 클래스로 생성한 Spring MVC컨트롤러로 웹 요청을 처리하는 데 사용된다.
** 따로 명시하지 않으면 URL은 기본적으로 GET방식으로 요청된다.
@Controller
@RequestMapping("/comments")
public class CommentsController {
//URL매핑 코드 작성
}
1. @Controller 어노테이션 선언
- 해당 클래스가 웹 애플리케이션에서 컨트롤러 역할을 한다는 것을 명시해 준다.
** 만약 해당 컨트롤러가 데이터만 출력할 경우 @RestController로 선언해도 된다. (하위에서 @ResponseBody을 쓰지 않아도 됨)
2. 상위 @RequestMapping 어노테이션 선언
- 요청 URL과 매핑될 메서드를 지정하는 데 사용, 클래스 밖에 명시해 줄 경우 하위의 모든 URL메서드에 해당 경로가 기본 적용된다.
** 위의 코드와 같이 작성할 경우 하위에 mapping 한 주소 경로 앞에 /comments가 기본적으로 붙음
//URL매핑 코드 예시
@Autowired
CommentsDAO dao;
@RequestMapping("/list.json")
@ResponseBody
public List<HashMap<String,Object>> list(int postid, int page, int size){
return dao.list(postid, page, size);
}
3. @Autowired 어노테이션 주입
빈으로 등록된 DAO호출하여 dao객체에 주입시켜 사용한다.
4. 하위 @RequestMapping 어노테이션 선언
- 해당 URL과 매핑시켜 /comments/list.json경로에 대한 요청처리를 해준다.
** 메서드 안에 return문은 페이지를 출력해야 하는 경우에 사용한다.
5. @ResponseBody 어노테이션
- 컨트롤러에서 반환되는 데이터를 HTTP응답 본문에 직접 출력하는 경우 사용하며 데이터를 json형태로 변환해 보내줄 수 있다.
** @RestController로 선언된 컨트롤러에는 따로 선언해주지 않아도 된다.
//POST 요청
@RequestMapping(value="/insert",method=RequestMethod.POST)
public void insert(CommentsVO vo){
dao.insert(vo);
}
- value에는 처리해 줄 URL을 작성, method는 RequestMethod.Post로 지정
6. View 생성
- src파일 - main - webapp - WEB-INF-views에다 JSP파일을 생성한다.
** 외부 이미지, css, js파일은 src - main - webapp - resource파일에다 생성
'BE > Java [Servlet , Spring]' 카테고리의 다른 글
Spring mysql DB와 연결하기 (pom.xml버전변경, root-context.xml 타임존) (0) | 2023.08.03 |
---|---|
[이클립스] 자바 라이브러리 JSP활용 - Gson, jstl, cos, mysql-connector (0) | 2023.04.04 |
핸들바로 JSP 데이터 출력하기 (mysql 데이터 json타입 변환) (0) | 2023.03.31 |
MVC구조 및 아파치 톰캣 서버를 사용한 JSP & Servlet 파일 생성 (0) | 2023.03.31 |
Oracle(SQL Developer) & JAVA 상품 주문 관리 프로그램 리뷰 - 1. SQL문 (0) | 2023.01.24 |