프로젝트 중에 수입지출을 관리하는 클래스에 insertExpenses라는 메소드를 작성 중이었다.
수입과 지출 목록을 DB에 삽입할 수 있게 하는 메소드인데,
Expenses 생성자 내에 date 타입을 넣기 위해 코드를 작성했다.
그런데 JSONObject인 msgObj에 getDate 메소드가 적용이 되지 않았다. (JSONObject 미숙 이슈)
public class ExpensesServiceImpl implements ExpensesService {
/**
* @author 혜발아기<br>
* insertExpenses : 수입 지출 내역을 DB에 저장하도록 하고<br>
* check을 통해 내역이 DB에 성공적으로 저장됐는지 확인하는 기능
*/
@Override
public void insertExpenses(WebSocket conn, String message) {
JSONObject msgObj = new JSONObject(message);
Integer userId = msgObj.getInt("userId");
Boolean type = msgObj.getBoolean("type");
Integer money = msgObj.getInt("money");
Integer categoryId = msgObj.getInt("categoryId");
String memo = msgObj.getString("memo");
Date expensesDate = msgObj.getDate("expensesDate");
Expenses expenses = new Expenses(userId, categoryId, type, money, memo, expensesDate);
int check = 0;
try {
check = ExpensesDAO.insertExpenses(DBConnection.getConnection(), expenses);
} catch (Exception e) {
e.printStackTrace();
}
if (check > 0) {
JSONObject ackObj = new JSONObject();
ackObj.put("result", "success");
conn.send(ackObj.toString());
} else {
JSONObject ackObj = new JSONObject();
ackObj.put("result", "fail");
conn.send(ackObj.toString());
}
}
}
// 문제가 생긴 부분
Date expensesDate = msgObj.getDate("expensesDate");
문제점1
: JSONObject에 .getDate 메소드를 적용하려니 빨간 밑줄이 생겼다.
이유?
: JSONObject 클래스에는 .getDate 메소드가 존재하지 않는다.
이유랄 것도 없다 그냥 숙지 미숙으로 인한 이슈다 이론 공부 좀 해야 함..
해결방법 적용 1차 시도
해결방법?
날짜를 파싱할 때 JSON 객체에서 문자열 형식으로 날짜를 받아오고, 이를 Date 객체로 변환해야 한다.
👉 getString 메서드를 사용해 문자열을 받은 후에 SimpleDateFormat 클래스를 사용해 Date 객체로 변환
// (1차 시도)Date expensesDate = msgObj.getDate("expensesDate");에서 변경한 코드
String dateString = msgObj.getString("expensesDate");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 날짜 포맷 지정
Date expensesDate = null;
try {
expensesDate = dateFormat.parse(dateString); // 문자열을 Date 객체로 파싱
} catch (ParseException e) {
e.printStackTrace();
}
java.sql.Date는 java.util.Date의 서브클래스라서 둘 간의 형변환은 안전하지만,
위와 같은 코드 역시 문제점이 있었다.
문제점2
SimpleDateFormat의 parse 메서드는 java.util.Date를 반환한다.
그런데 우리는 DB에 값을 저장하기 위해서는 java.sql.Date 형태를 이용해야 한다.
해결방법 2차 시도
해결방법
SimpleDateFormat으로 날짜를 파싱한 후, 그 결과를 이용해 java.sql.Date 객체를 새로 생성했다.
Date expensesDate = null;
try {
java.util.Date parsedDate = dateFormat.parse(dateString);
expensesDate = new java.sql.Date(parsedDate.getTime());
} catch(ParseException e) {
e.printStackTrace();
}
관련 내용 정리
1. JSONObject 클래스 내에는 SimpleDateFormat 클래스가 존재한다.
👉 날짜 정보를 얻기 위해서는 getDate가 아닌 getString 메서드를 사용
👉 문자열을 받은 후에 SimpleDateFormat 클래스를 사용해 Date 타입으로 변환
- SimpleDateFormat 객체.parse(java.util.Date 타입으로 변환할 String 객체)
👉 이런 형태로 코드를 작성할 수 있음
👉 .parse : 괄호 안에 담긴 문자열을 Date 객체로 파싱하는 역할을 함
❗ 이때 문자열은 특정 형식의 날짜와 시간을 나타내는 형식이어야 함. 그렇지 않으면 ParseException 발생
2. java.util.Date와 java.sql.Date 차이점 비교
java.util.Date | java.sql.Date | |
공통점 | 날짜와 관련된 정보를 가지고 올 수 있다. | |
차이점 | - 년/월/일/시/분/초의 형태 - getTime 사용 |
- java.util.Date를 상속받음 - SQL Date 값으로 식별할 수 있도록 년/월/일의 정보를 가지고 있음 - getDate 사용 |
글은 추후 더 다듬을 예정!
'Trouble Shooting' 카테고리의 다른 글
[SpringBoot & Postman] HTTP method names must be tokens 오류 해결 (0) | 2024.06.25 |
---|---|
[NCP] Server 생성 시 잘못된 IP입니다. 해결 방법 (1) | 2024.05.28 |
[SpringBoot] SpringBoot 3 버전 Querydsl build.gradle 설정 오류 및 해결 (0) | 2024.05.07 |
[Spring] beancreationexception 오류 해결 (0) | 2024.05.03 |
🛠 물고기 방향키 이동 예제 🛠 .style vs .getComputedStyle(), parseInt() vs Number() (4) | 2024.03.07 |