0901 | Dao CRUD 구현 / 서비스단 함수 구현 / 서블릿 개념 기초
✅ Dao에서 기본 select구문 만들기
<select id="findAll" resultMap="menuMap">
select * from menu
</select>
✅ Dao에서 select구문에 result와 parameter가 둘 다 있다면?
: 넘겨받는 파라미터는 두가지 종류가있다
1. 기본형식이냐 2. 객체냐 (객체를 통으로 넘긴다)
👉 기본형은 그냥 el로 꽂아줌
👉 파라미터타입은 객체에서 속성을 빼서 쓸때 사용하는것
<select id="findById" resultMap="menuMap">
select * from menu where id=#{id}
</select>
✅ Dao에서 Insert 구문 만들기
: insert/update/delete는 반환값이 있는게 아니므로 select처럼 resultType 이나 resultMap을 쓰진 않는다
: parameterType은 각 파라미터와 타입이 일치하지 않을 수 있으므로 객체로 전달한다 ▶ parameterType="Menu"
👉 이 뜻은 파라미터 타입을 Menu로 전달하겠단 뜻임 마치 <제네릭>처럼!
💥 values안에 변수를 꽂아줄 때 속성명을 이용하는건지 getter를 쓰는건지 잘 구분해야 한다
<insert id="save" parameterType="Menu">
insert into menu(kor_name, eng_name, price, img, memer_id)
values ('카페라떼','cafelatte',2700,'latte.png',1);
</insert>
//변수는 el로 꽂아주기
<insert id="save" parameterType="Menu">
insert into menu(kor_name, eng_name, price, img, memer_id)
values (#{korName},#{engName},#{price},#{img},#{memberId});
</insert>
✅ Dao에서 Update 구현하기
: 업데이트나 등록할땐 집합화된 데이터를 등록하는 것!
👉 아이디만 전달하면 되는게 아니라 아이디에 해당하는 내용 중 어떤걸 바꿀건지가 전달되어야 함
<update id="update" parameterType="Menu">
UPDATE menu SET kor_name = #{korName} WHERE id=#{id}
</update>
update와 insert는 menu객체를 만들어서 해당 객체에 setter로 값을 넣어준 뒤 repository의 dao함수와 연결하여 테스트해봄! (parameterType에 적어둔대로 매개변수에 menu인스턴스가 통채로 들어간다)
✅ Dao에서 delete 구현하기
반환값이 필요한 select외에는 resultType, resultMap이 들어갈 일이 없다. 반환값이 없는 delete는 아무 인자도 필요치 않게 됨!
<delete id ="delete">
delete from menu where id=#{id}
</delete>
✅ 서비스단 구현하기
👉 한 페이지에는 메뉴테이블이 갖고있지 않은 정보가 포함될 수 있다. 그렇다면 서비스단에서는 그 부분을 어떻게 한페이지에서 구현할것인가! ▶ 다른 repository의 값을 menu service에서 가져다 쓰게됨
🔥 다오는 서비스가 쓰고 서비스함수는 업무단에서만 쓴다
#️⃣ MenuServiceImp의 서비스함수 구현하기
public class MenuServiceImp implements MenuService {
private MenuRepository repository;
public MenuServiceImp() {
try (SqlSession session = App.sqlSessionFactory.openSession()) {
repository = session.getMapper(MenuRepository.class);
}
}
@Override
public List<Menu> getList() {
List<Menu> list = repository.findAll();
return list;
}
@Override
public Menu getById(long id) {
Menu menu = repository.findById(id);
return menu;
}
@Override
public void like(Long memberId, long id, boolean on) { // 다른리파지토리에서 가져다가 만드는 부분
// if(on) {
// Like like = new Like(id, memberId);
// likeRepository.save(like);
// } else
// likeRepository.delete(like);
}
}
✅ 화면 만들때 주의사항
👀 Dao를 만드는 이유
👉 업무로직을 만드는 사람이 데이터베이스를 몰라도 된다 (내부적으로 어떻게 데이터를 가져오는지는 알 필요가 없고 Dao만 사용하면 됨)
: 데이터소스가 변경되어도 업무는 영향을 받지 않는다
: 시스템과 계층을 나눠 만들면 책임소재가 분명해짐 (* 유지보수가 편하다는건 당연한 얘기)
: 페이지입장에서는 서비스함수만 보여야 한다. 서비스가 직접 쿼리를 이용하는게 아니라 서비스가 insert()를 쓴다!
✅ 서블릿 역할 익히기
👉 톰캣은 클라이언트 요청을 받은거고 클라이언트 요청을 매핑한 서블릿이 작동되면서 문서를 만든다.
(*서블릿은 화면구성에 필요한 데이터를 얻어오기 위해 서비스단에 요청한다)
#️⃣ 톰캣의 영역 두가지
웹서버(WS) : 웹클라이언트와 대화하는 영역
웹어플리케이션서버(WAS) : 동적 문서를 생성하는 영역
🔥 서버에는 두가지 문서가 있다
1. 정적자원 : 서버가 가지고 있는 코드 (클라이언트의 요청에 따라 실행되기를 기다리는 코드)
2. 동적자원 : 동적문서 == 서버페이지 (서버에서 코드를 실행해서 만든 페이지) ▶ 코드를 실행해주는 서버가 필요하다 ▶ 어플리케이션 서버!
대기를 타고있는 코드들 하나가 서버어플리케이션이 아니라 다 통틀어서 서버어플리케이션이고 하나하나는 서블릿 (기능단위로 쪼개져있는 조각)에 해당한다.