View
김영한 강사님의 스프링 강의 입문을 공부하는 도중, 예문에 문득 의구심이 들면서 헷갈리기 시작한 곳이 있었다.
우선 정해진 가정으로, DB가 정해지지 않았지만 미리 개발을 해야 하는 상황이 와서 DB를 대신하여 HashMap 을 이용했고,
기존 쿼리 insert 역할을 대신 해 줄 save() 메서드에서 생긴 의문이다.
package hello.hellospring.domain;
public class Member {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
우선 내가 의문점을 가진 지점을 파악하려면 member 객체를 알아야 한다.
위 코드 블럭은 member 객체를 구성하는 메서드와 변수이다.
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
}
여기에서 드는 의문이 있었다. 나는 항상 Map 에 <String, String> 식으로 넣어 왔었기 때문에 해당 구문이 헷갈렸다. 시퀀스는 mysql 에서 오토 인크리먼트처럼 들어간다고 생각했기 때문에 store 의 key 를 idx 처럼 생각해 버린 것이다.
만약 store.put 을 넣게 된다면 (1, (사용자가 입력한 ID값, 사용자가 입력한 name 값)) 으로 구성이 된다고 생각했다.
예를 들어 (1, (hyper, 하이퍼)) 처럼 된다고 생각한 것이다.
그런데 member 에 선언된 ID 변수가 Long 으로 되었고, 아무래도 강사님이 의도한 것은 (1, (사용자가 입력한 name 값)) 인 것처럼 보였다. 그래서 여기에서 또 헷갈리기 시작한 것이 그렇다면 왜 name 이 아니라 member 객체를 집어넣은 것인가 하는 의문이었다.
의구심이 풀리지 않던 와중(...) 다시 map 의 개념을 찾아보았다.
만약 key, 즉 people 을 입력하면 사람이, baseball 를 입력하면 야구가.
다시 save 메서드를 보자.
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
member 객체에 이미 시퀀스는 저장됐다. 즉, 현재 member 객체는 (1, _) 상태이다. /* name 은 공란, 입력 대기 상태 */
만약 store.put 으로 저장하게 되면, 예를 들어 (1, (1, _)) 같은 식으로 저장이 되는 것이다.
그러니까 말로 표현해 보자면, 1번 객체에 ID 1, 사용자 입력 대기 중인 name 이 store 에 담긴 것이다.
나는 그동안 Map 을 쿼리 돌릴 파라미터들의 값만 담아 넘겨 오는 로직을 사용했었는데, 해당 강의 덕분에 Map 에 대해서 좀 더 견고히 개념을 다질 수 있는 시간이 된 것 같다.
만약 XML 을 이용하여 쿼리를 실행할 때 어떻게 파라미터를 두 개 넘겨야 하는지 고민이 되는 사람이 있다면, 아래 코드를 참고해 보면 좋을 것 같다.
Map<Object, Object> map=new HashMap<Object, Object>();
map.put("buyerlike_buyerId", buyerlike_buyerId);
map.put("buyerlike_reviewidx", buyerlike_reviewidx);
ReviewLikeDTO likeDTO=sqlSession.selectOne("review.findLike", map);
findLike 란 쿼리 실행문 안에 buyerlike_buyerID, buyerlike_reviewidx 의 값을 넣어 주어야 하는 상황이었다.
findLike ↓
<select id="findLike" resultType="ReviewLikeDTO">
SELECT buyerlike_heart
FROM buyerlike
WHERE buyerlike_buyerId=#{buyerlike_buyerId} AND buyerlike_reviewidx=#{buyerlike_reviewidx}
</select>