서론
스프링 프레임워크의 다형성과 캡슐화로 인해 편의성이 대폭 상승함을 느꼈습니다.
다만, 실질적으로 함축적이기에 어려운 내용이라고 느꼈습니다. 가능한 구조적인 부분과 형식적인 부분에 대해 학습하려 했고, 이해하는 시간이 더 필요하다는 생각이 들었습니다.
1. 내용정리
(@RequestMapping은 value={"/modify", "/delete"}처럼 여러 개의 URL을 지정할 수 있으며, params, headers 등의 조건을 추가해 더욱 세밀하게 매핑 가능애플리케이션 전역에서 공통 코드의 재사용성과 유지보수를 크게 개선하고 인증, 권한 체크와 같이 반복적으로 필요하지만 분리된 로직을 중앙집중적으로 관리할 때 유용한 도구
서버 사이드 템플릿 엔진 / 컨트롤러에서 전달받은 모델 데이터를 HTML 템플릿 내의 표현식을 사용해 동적으로 렌더링
th:text="\${member.name}"th:value="*{username}"th:text="#{welcome.message}th:href="@{/lecture/expression}th:replace="~{fragments/header :: header}public interface MenuMapper {
@Results(id="menuResultMap", value = {
@Result(id= true, property = "menuCode", column = "menu_code"),
@Result(property = "menuName", column = "menu_name"),
@Result(property = "menuPrice", column = "menu_price"),
@Result(property = "categoryCode", column = "category_code"),
@Result(property = "orderableStatus", column = "orderable_status")
})
@Select(" SELECT\n" +
" menu_code\n" +
" , menu_name\n" +
" , menu_price\n" +
" , category_code\n" +
" , orderable_status\n" +
" FROM tbl_menu\n" +
" WHERE orderable_status = 'Y'\n" +
" ORDER BY menu_code")
List<MenuDTO> selctAllMenu();
@ResultMap("menuResultMap")
@Select("SELECT\n" +
" menu_code\n" +
" , menu_name\n" +
" , menu_price\n" +
" , category_code\n" +
" , orderable_status\n" +
" FROM tbl_menu\n" +
" WHERE menu_code = #{ menuCode }")
MenuDTO selectMenuByMenuCode(int menuCode);
@Insert(" INSERT\n" +
" INTO tbl_menu(menu_name, menu_price, category_code, orderable_status)\n" +
" VALUES\n" +
" (#{ menuName }, #{ menuPrice }, #{ categoryCode }, 'Y')")
int insertMenu(MenuDTO menu);
@Update(" UPDATE tbl_menu\n" +
" SET menu_name = #{ menuName }\n" +
" , menu_price = #{ menuPrice }\n" +
" , category_code = #{ categoryCode }\n" +
" WHERE menu_code = #{ menuCode }")
int updateMenu(MenuDTO menu);
@Delete(" DELETE\n" +
" FROM tbl_menu\n" +
" WHERE menu_code = #{ menuCode }")
int deleteMenu(int menuCode);
}
[mybatis-config.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 개발 환경 설정, 기본값을 'development'로 지정 -->
<environments default="development">
<environment id="development">
<!-- 트랜잭션 관리 설정: JDBC를 사용하여 직접 관리 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED"> <!-- 데이터베이스 연결 풀 사용 -->
<!-- MySQL JDBC 드라이버 설정 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 데이터베이스 연결 URL 설정 (로컬 MySQL, menudb 사용) -->
<property name="url" value="jdbc:mysql://localhost:3306/menudb"/>
<!-- 데이터베이스 접속 계정 정보 -->
<property name="username" value="ohgiraffers"/>
<property name="password" value="ohgiraffers"/>
</dataSource>
</environment>
</environments>
<!-- 매퍼(XML 파일) 등록: SQL 문을 포함하는 매퍼 지정 -->
<mappers>
<mapper resource="menu-mapper.xml"/>
</mappers>
</configuration>
[mapper.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ohgiraffers.transaction.mapper.OrderMapper">
<!-- select -->
<select id="selectDate" resultType="java.util.Date">
select NOW()
</select>
<!-- insert -->
<insert id="insertOrder" useGeneratedKeys="true" keyProperty="orderCode">
INSERT INTO tbl_order (order_date, order_time, total_order_price)
VALUES (#{ orderDate }, #{ orderTime }, #{ totalOrderPrice })
</insert>
<insert id="insertOrderMenu">
INSERT INTO tbl_order_menu (order_code, menu_code, order_amount)
VALUES (#{ orderCode }, #{ menuCode }, #{ orderAmount })
</insert>
</mapper>
[application.yml]
# mybatis config
mybatis:
configuration:
map-underscore-to-camel-case: true
type-aliases-package: com.ohgiraffers.transaction
mapper-locations: mappers/**/*.xml
2. 마무리
SQLD 자격증 시험은 생각보다 쉽지 않았고, 결과는 좋지 못할 것 같아 아쉬움이 남습니다.
첫 자격증 시험이라는 것에 의미가 있었고, 쿼리문을 복습했다는 점에 의의를 두었습니다.
회고를 작성하면서 느낀 점은 학습 내용을 요약하여 정리하지 못했다고 느꼈습니다.
효과적인 복습을 위해 핵심 내용을 보다 체계적으로 정리하는 방법이 필요해 보입니다.
MyBatis CRUD JavaConfig방식, MyBatis와 Spring 연동에 관해 재복습하고 테스트
커리큘럼 : 스프링 프레임워크 (JPA)
08/09 : ADsP 자격증 시험