▶ 기본 정보
< ERP(영업관리) 프로그램 개발 및 유지보수>
Skills : Java 8, Java Swing MVC, Sping, ibatis 2.0, Oracle 11g
< 프로젝트 구조 >
[ERP]
|-- src
|--- menu
|----- CouponHistory.java
|----- CouponHistoryView.java
[MW]
|-- src
|--- biz
|--- dao
|--- dto
|--- sql
|-- conf
|--- SqlMap.xml
** 테이블명, 코드 구성, 변수 이름 등의 자세한 정보는 배제하고 조건이나 화면 등 일부 내용 변경하여 소개한다.
0. 쿠폰 발급/사용 내역 조회
쇼핑몰에서 주문할 때 발급되는 난수쿠폰에 대해 발급건과 사용건을 각각 조회하는 메뉴를 생성해야 한다.
쿠폰명과 일자를 입력하면 '일자, 발급건수, 사용건수'가 올바르게 조회되어야 한다.
1. 개발 순서 설정
- View 1차 개발
- 관련 테이블 분석 및 SQL문 생성
- DTO 작성
- XML 작성 (SQL)
- DAO 작성
- BIZ 작성
- 서비스단 1차 개발
- View 및 서비스단 2차 개발
- 코드 실행 및 기능 구현 확인
2. 개발 과정
2-1. View 1차 개발
Java Swing을 이용한 View 개발을 1차로 진행 완료하였다.
JPanel 클래스 상속
JPanel을 View.java 클래스 파일에 상속하여 아래와 같은 클래스들을 이용해 View를 구성했다.
- JTable
- CmTableAdapter
- JTextField
- JDateChooser
- ButtonGroup
- JButton
생성자
서비스단과 View를 연결하기 위해 View 클래스의 생성자를 만들었다.
서비스단 매개변수를 받아 this.parent에 할당하고, View에서 생성한 init()를 호출하여 초기화를 진행하도록 했다.
한마디로, View 클래스가 서비스단 객체를 받아서 자신의 필드인 parent에 저장하는 생성자인 것이다.
// abcView : View 코드
// abc : 서비스단 코드
public abcView(abc parent) {
this.parent = parent;
init();
}
init(), makeTable() 작성
- init() : 초기화 위함
- makeTable() : 난수쿠폰 발급/사용 내역 조회 테이블 생성 위함
2-2) 관련 테이블 분석 및 SQL문 생성
2-2-1) 관련 테이블 분석
난수쿠폰 발급/사용 내역을 조회하려면 어떤 테이블들이 필요할까?
<필요 테이블 - 1. 난수쿠폰 발급/사용 내역 조회>
1. calendar
2. coupon_create
year month_day 2024 (연도) 0708 (월일)
3. coupon_used
discnt_id update_date id 10 (할인 쿠폰 아이디) 20240708 test1 (쿠폰 발급한 관리자 아이디)
* 조건
discnt_id used_date used 10 (할인 쿠폰 아이디) 20240708 (쿠폰 사용일) 1 (1:사용함, 2:사용안함)
- calendar.year || calendar.month_day = coupon_create.update_date
- calendar.year || calendar.month_day = coupon_used.update_date
<필요 테이블 - 2. 난수쿠폰 발급/사용 상세내역 조회>
1. coupon_create
2. coupon_used
code no csdf2342 (난수 쿠폰 번호) 2 (coupon_used.create_no값)
3. order_info
used_date order_id create_no discnt_id used 20240708 (쿠폰 사용일) 234 (주문자 아이디) 2 (쿠폰 발급 number) 10 (할인 쿠폰 아이디) 1 (사용여부 / 1:사용)
* 조건
store_id order_id 38 (매장 아이디) 234 (주문자 아이디)
- coupon_used.order_id = order_info.order_id
- coupon_used.create_no = coupon_create.no
해당 테이블들을 이용하여 특정 데이터 조회에 필요한 SQL문을 작성해야 한다.
2-2-2) SQL문 생성
1. 난수쿠폰 발급/사용 내역 조회
최종 결과 내역 조회는 다음과 같이 출력되어야 한다.
일자 | 쿠폰 발급량 | 쿠폰 사용량 |
20240708 (예시) | 17 | 3 |
1. 테이블 A
<calendar>에서 year컬럼과 month_day컬럼을 합쳐 특정 범위의 기간을 조회한 결과 출력
SELECT YEAR || MONTH_DAY AS cal_date FROM CALENDAR WHERE YEAR || MONTH_DAY BETWEEN '20240601' AND '20240630';
2. 테이블 B
<coupon_create>에서 update_date컬럼을 char 타입으로 변경해 'yyyymmdd'형식에 맞춰 출력,
특정 범위 내 각각의 날짜마다 쿠폰 발급 횟수 카운트
SELECT to_char(update_date,'yyyymmdd') AS regist_date, count(*) AS regist_cnt FROM coupon_create WHERE DISCNT_ID = 100 AND to_char(update_date,'yyyymmdd') BETWEEN '20240601' AND '20240630' AND id IS NOT NULL GROUP BY to_char(update_date,'yyyymmdd');
3. 테이블 C
<coupon_used>에서 used_date컬럼 표시,
특정 범위 내 각각의 날짜마다 쿠폰 사용 횟수 카운트
SELECT used_date, count(*) AS use_cnt FROM COUPON_USED WHERE DISCNT_ID = 100 AND used_date BETWEEN '20240601' AND '20240630' AND used= 1 GROUP BY used_date;
4. 난수쿠폰 발급/사용량 조회에 필요한 정보는 A, B, C 테이블 중 A.cal_date, B.regist_cnt, C.use_cnt이다.
SELECT a.cal_date /* 일자 */ , b.regist_cnt /* 쿠폰 발급량 */ , nvl(c.use_cnt,0) /* 쿠폰 사용량 */
5. 이때 조건은 a.cal_date와 b.regist_date가 동일, a.cal_date와 c.cused_date가 동일해야 한다.
WHERE a.cal_date = b.regist_date(+) AND a.cal_date = c.used_date(+)
outer join을 이용하여 조건절을 작성했다.
a 테이블의 모든 행이 결과에 포함되며, b 또는 c 테이블의 매칭되지 않는 값은 NULL로 표시하기 위함이다.
6. 정렬 기준은 a.cal_date를 메인으로 정렬한다.ORDER BY a.cal_date
2. 상세조회
최종 결과 조회는 아래와 같아야 한다.
일자 | 매장 아이디 | 쿠폰코드 | 주문 아이디 |
20240709 | 11 | GPTKK123 | 123 |
1. 테이블 설정
가져올 테이블은 총 3개이다.
FROM coupon_used a, coupon_create b, order_info c
2. SELECT 설정SELECT a.used_date, c.store_id, b.coupon_code, a.order_id
3. 조건절 설정
이때 조건은 coupon_create.no와 coupon_used.create_no와 같아야 한다.
또한 coupon_used.order_id와 order_info.order_id도 같아야 하며,
coupon_used.discnt_id의 값이 100번이어야 한다.
used_date는 '20240701'에서 '20240730' 사이어야 하며,
coupon_used는 1이어야 한다.WHERE a.create_no = b.no AND a.ORDER_ID = c.ORDER_ID AND a.DISCNT_ID = 100 AND a.used_date BETWEEN '20240701' AND '20240730' AND a.used= 1
4. 정렬 조건ORDER BY a.USED_DATE,c.STORE_ID,a.ORDER_ID ;
2-3) DTO 작성
위 생성된 SQL문으로 DTO를 작성해보겠다.
SELECT에 적은 컬럼들을 DTO에 작성해주면 된다.
// 쿠폰 발급 및 사용 내역 조회
private String canlendarDate; // 일자
private int couponRegistCnt; // 쿠폰 등록량
private int couponUseCnt; // 쿠폰 사용량
// 이하 생략
// 쿠폰 발급 및 사용 내역 상세조회
// 이하 생략
변수 작성 후 Getter, Setter 추가해주었다.
2-4) XML 작성 (SQL)
1. namespace 설정
<sqlMap namespace="nsCouponHistory"></sqlMap>
2. sqlmap 설정
나의 경우, 주로 검색 조건들을 써주었다.
내가 개발하는 메뉴가 검색조건을 입력하면 데이터를 화면에 나타내주는 것이 전부이기 때문이다.
<parameterMap id="mapSearchOpt" class="java.util.Map">
<parameter property="discntId" javaType="java.lang.Integer" jdbcType="NUMBER"/> <!-- 쿠폰ID -->
</parameterMap>
특정 값의 조건을 통해 검색하여 데이터를 보여주는 구조이다.
나머지 파라미터들은 생략하겠다.
3. 쿠폰 발급 및 사용 내역 조회 SELECT문 작성
// 쿠폰 발급 및 사용 내역 SELECT문
<select id="couponHistory" parameterMap="mapSearchOpt" resultClass="common.db.dto.CouponHistoryDTO">
</select>
// 쿠폰 발급 및 사용 상세내역 SELECT문
<select id="couponHistoryDetail" parameterMap="mapSearchOpt" resultClass="common.db.dto.CouponHistoryDTO">
</select>
파라미터값을 이용해야 하는 조건절은 아래와 같이 작성하였다.
<dynamic prepend="WHERE">
<isNotEmpty property="startDate" prepend="AND">
<isNotEmpty property="endDate">
YEAR || mmdd BETWEEN #startDate# AND #endDate# /* 시작일자 ~ 종료일자 */
</isNotEmpty>
</isNotEmpty>
</dynamic>
2-5) DAO 작성
1. 쿠폰 발급 및 사용 내역 조회 - selectCouponHistory
@SuppressWarnings("unchecked")
public ArrayList<CouponHistoryDTO> selectCouponHistory(SqlMapClient sqlMap, HashMap<String, Object> map){
//이하 생략
}
2. 쿠폰 발급 및 사용 상세내역 조회 - selectSerialNoHistoryDetail
@SuppressWarnings("unchecked")
public ArrayList<CouponHistoryDTO> selectCouponHistoryDetail(SqlMapClient sqlMap, HashMap<String, Object> map){
//이하 생략
}
2-6) BIZ 작성
1. 생성자 작성
public CouponHistoryBIZ(SqlMapClient sqlMap) {
this.sqlMap = sqlMap;
this.CouponHistoryDAO = new CouponHistoryDAO();
}
2. 쿠폰 발급 및 사용 내역 조회
public Object selectCouponHistory(Object obj) {
//이하 생략
}
3. 쿠폰 발급 및 사용 상세내역 조회
public Object selectCouponHistoryDetail(Object obj) {
//이하 생략
}
2-7) 서비스단 1차 개발
쿠폰 리스트 팝업창 연동
'[Project] > 업무일지' 카테고리의 다른 글
[XML/SQL/Oracle] SQLSyntaxErrorException: ORA-00911: invalid character (0) | 2024.07.11 |
---|---|
[XML/SQL/Oracle] SQLSyntaxErrorException: ORA-02000: missing WITHIN keyword (0) | 2024.07.10 |
[Java Swing] ArrayIndexOutOfBoundsException (0) | 2024.07.10 |
NestedSQLException, ProbeException (0) | 2024.07.04 |
java.text.ParseException: Unparseable date, SQLSyntaxErrorException: ORA-00947 (0) | 2024.07.03 |