[Inflearn]/자바 스프링 프레임워크(renew ver.)
[inflearn] 20240113 [스프링-프레임워크] - 17강 필기
Jelly-fish
2024. 1. 13. 16:20
17강 - Service & Dao 객체 구현
웹 프로그래밍의 구조에서 Service 와 DAO 객체의 구현에 대해서 학습한다.
17-1 웹 어플리케이션 준비
17-2 한글 처리
17-3 서비스 객체 구현
17-4 DAO 객체 구현
17-1 웹 어플리케이션 준비
[웹 어플리케이션의 일반적인 프로그램 구조]
사용자 요청(브라우저)
↓
프론트 컨트롤러 (Dispatcher Servlet) → 뷰 (View, Jsp 파일)
↓
컨트롤러
↓
서비스
↓
DAO (Data Access Object)
↓
Database
17-2 한글 처리
web.xml [DispatcherServlet 서블릿 등록]
<!-- Dispatcher Servlet 등록 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
web.xml [한글 처리]
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
17-3 서비스 객체 구현
- 방법 1 : new 연산자를 이용한 service 객체 생성 및 참조 (지양해야 할 방식)
// 의존 객체를 직접 주입하는 방식
MemberService service = new MemberService();
- 방법 2 : 스프링 설정파일을 이용한 서비스 객체 생성 및 의존 객체 자동 주입
<!-- ① applicationContext.xml 파일에서 다음과 같이 빈(Bean) 객체 생성 -->
<beans:bean id="service" class="com.bs.lec17.member.service.MemberService"></beans:bean>
// ② 의존 객체를 필요로 하는 클래스에 의존 객체 자동 주입
@Autowired
MemberService service;
- ★ 방법 3 : 어노테이션을 이용해서 서비스 객체 생성 및 의존객체 자동 주입 ★
// ① 서비스 객체 생성
@Repository("memService")
public class MemberService implements IMemberService
{ .... }
// ② 의존 객체 자동주입
@Resource(name="memService")
MemberService service;
17-4 DAO 객체 구현
Member.java (회원 정보를 담는 객체 DTO (Data Transfer Object))
package com.bs.lec17.member;
public class Member
{
private String memId;
private String memPw;
private String memMail;
private String memPhone1;
private String memPhone2;
private String memPhone3;
// getter / setter 생략 ...
public String getMemId() {
return memId;
}
public void setMemId(String memId) {
this.memId = memId;
}
// ....
}
IMemberDAO.java (인터페이스)
package com.bs.lec17.member.dao;
import com.bs.lec17.member.Member;
public interface IMemberDAO
{
// 회원 정보 입력
void memberInsert(String memId, String memPw, String memMail, String memPhone1, String memPhone2, String memPhone3);
// 회원 정보 검색 → id, pw 로 검색 후 회원 객체 반환
Member memberSelect(String memId, String memPw);
// 회원 정보 수정
void memberUpdate();
// 회원 정보 삭제
void memberDelete();
}
MemberDAO.java (위의 인터페이스를 구현한 DAO 객체)
package com.bs.lec17.member.dao;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import com.bs.lec17.member.Member;
//@Component
@Repository
public class MemberDao implements IMemberDao {
private HashMap<String, Member> dbMap;
public MemberDao() {
dbMap = new HashMap<String, Member>();
}
@Override
public void memberInsert(String memId, String memPw, String memMail, String memPhone1, String memPhone2, String memPhone3) {
System.out.println("memberInsert()");
System.out.println("memId : " + memId);
System.out.println("memPw : " + memPw);
System.out.println("memMail : " + memMail);
System.out.println("memPhone : " + memPhone1 + " - " + memPhone2 + " - " + memPhone3);
Member member = new Member();
member.setMemId(memId);
member.setMemPw(memPw);
member.setMemMail(memMail);
member.setMemPhone1(memPhone1);
member.setMemPhone2(memPhone2);
member.setMemPhone3(memPhone3);
dbMap.put(memId, member);
Set<String> keys = dbMap.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Member mem = dbMap.get(key);
System.out.print("memberId:" + mem.getMemId() + "\t");
System.out.print("|memberPw:" + mem.getMemPw() + "\t");
System.out.print("|memberMail:" + mem.getMemMail() + "\t");
System.out.print("|memberPhone:" + mem.getMemPhone1() + " - " +
mem.getMemPhone2() + " - " +
mem.getMemPhone3() + "\n");
}
}
@Override
public Member memberSelect(String memId, String memPw) {
Member member = dbMap.get(memId);
return member;
}
@Override
public void memberUpdate() {
}
@Override
public void memberDelete() {
}
}
★ 방법 3 : 어노테이션을 이용해서 서비스 객체 생성 및 의존객체 자동 주입
①
서비스 객체로 쓰일 클래스라는 것을 명시하기 위해
어노테이션 `@Service` 를 MemberService 에 명시해 준다.
MemberService.java
@Service
public class MemberService implements IMemberService
{
....
}
②
서비스 객체를 필요로 하는 컨트롤러인 MemberController 에서
`@AutoWired` 어노테이션을 작성해 주면, 의존객체 자동주입이 이루어진다.
@Controller
public class MemberController
{
@Autowired
MemberService service;
....
}
★ [Key Point]
서비스 객체인 MemberService.java 클래스 상단에
`@Service` 어노테이션을 붙여주게 되면
자동적으로 스프링 컨테이너에 담기게 되기 때문에,
MemberController.java 에서 `@AutoWired` 어노테이션만으로
의존 객체 자동 주입이 이루어진 것이다.
`@Service` 를 대체할 수 있는 어노테이션
- `@Component`
- `@Repository`
DAO 객체에서의 `@Component` `@Repository` 어노테이션 사용.
DAO 객체도, Service 객체와 마찬가지로
`@Component`나, `@Repository` 어노테이션을 클래스에 명시해 주는 방법을 통하여
자동적으로 스프링 컨테이너에 담기도록 처리할 수 있다.
MemberDAO.java
@Component
// @Repository
public class MemberDAO implements IMemberDAO
{
....
}
MemberService.java
@Autowired
MemberDao dao;