하.. 이 간단한 거 하는데에 2시간이 걸렸다. 뭐라해야되지.. 다른사람들은 나보다 잘하는것 같은데
나는 왜 더 빨리하지 못할까 라는 생각도 들고 만감이 교차한다. 내가 이분야에 천부적인 재능은 없을지언정,
나는 타고난 끈기로 실력의 격차를 줄여나가리다. 🔥 🔥 🔥
MemberMpp.xml
<insert id="insert">
INSERT INTO infrMember (
ifmmName
,ifmmId
,ifmmDelNy
,ifmmPassword
,ifmmPassword2
,ifmmDob
,ifmmGenderCd
,regDateTime
,ifmmEmailConsentNy
,ifmmSmsConsentNy
,ifmmPushConsentNy
)
VALUES (
#{ifmmName}
,#{ifmmId}
,0
,#{ifmmPassword}
,#{ifmmPassword2}
,#{ifmmDob}
,#{ifmmGenderCd}
,#{regDateTime}
,#{ifmmEmailConsentNy}
,#{ifmmSmsConsentNy}
,#{ifmmPushConsentNy}
)
<selectKey resultType="String" keyProperty="ifmmSeq" order="AFTER">
SELECT last_insert_id()
</selectKey>
</insert>
SQL에 생성해준 컬럼과 일치하도록 잘 확인한 후에 추가 시켜준다.
MemberMpp.xml 파일은 가장 예민하다.
쿼리가 틀리면 모든것이 뒤틀릴수 있다.
<select id="selectOne" resultMap="resultMapObj">
SELECT
a.ifmmSeq
,a.ifmmName
,a.ifmmId
,a.ifmmDelNy
,a.ifmmPassword
,a.ifmmPassword2
,a.ifmmDob
,a.regDateTime
,a.ifmmEmailConsentNy
,a.ifmmSmsConsentNy
,a.ifmmPushConsentNy
,b.ifmpNumber
,b.ifmpTelecomCd
,c.ifmeEmailFull
,d.ifmaAddress1
,d.ifmaAddress2
,d.ifmaZipcode
,f.ifnName
,g.ifcdName
FROM
infrMember a
LEFT JOIN
infrMemberPhone b ON a.ifmmSeq = b.ifmmSeq
LEFT JOIN
infrMemberEmail c ON a.ifmmSeq = c.ifmmSeq
LEFT JOIN
infrMemberAddress d ON a.ifmmSeq = d.ifmmSeq
LEFT JOIN
infrMemberNationality e ON a.ifmmSeq = e.ifmmSeq
LEFT JOIN
infrNationality f ON e.ifmnSeq = f.ifnSeq
LEFT JOIN
infrCode g ON g.ifcdSeq = a.ifmmGenderCd
WHERE
1 = 1
AND a.ifmmSeq = #{ifmmSeq}
</select>
selectOne은 상세정보에 가져올 데이터 들을 말한다.
여기도 사진을 보면 데이터를 넣어주었다.
Insert는 단지 삽입해주기 때문에 DB에 데이터가 들어와도
보여주지 않으면 View단에서 데이터가 매핑되지 않는다.
MemberController.java
@RequestMapping(value = "/member/memberInst")
public String memberInst(Model model, Member dto, MemberVo vo, RedirectAttributes redirectAttributes) throws Exception {
System.out.println("dto.getIfmmId(): " + dto.getIfmmId());
System.out.println("dto.getIfmmName(): " + dto.getIfmmName());
System.out.println("dto.getIfmmDob(): " + dto.getIfmmDob());
System.out.println("dto.getIfmpNumber(): " + dto.getIfmpNumber());
System.out.println("dto.getIfmpTelecomCd(): " + dto.getIfmpTelecomCd());
System.out.println("dto.getIfmmPassword(): " + dto.getIfmmPassword());
System.out.println("dto.getIfmmPassword2(): " + dto.getIfmmPassword2());
System.out.println("dto.getIfmmGenderCd(): " + dto.getIfmmGenderCd());
System.out.println("dto.getRegDateTime(): " + dto.getRegDateTime());
System.out.println("dto.getIfmeEmailFull(): " + dto.getIfmeEmailFull());
System.out.println("dto.getIfmaAddress1(): " + dto.getIfmaAddress1());
System.out.println("dto.getIfmaAddress2(): " + dto.getIfmaAddress2());
System.out.println("dto.getIfmaZipcode(): " + dto.getIfmaZipcode());
System.out.println("dto.getIfmmEmailConsentNy(): " + dto.getIfmmEmailConsentNy());
System.out.println("dto.getIfmmSmsConsentNy (): " + dto.getIfmmSmsConsentNy());
System.out.println("dto.getIfmmPushConsentNy(): " + dto.getIfmmPushConsentNy());
// 입력을 작동시킨다.
int result = service.insert(dto);
System.out.println("result: " + result);
vo.setIfmmSeq(dto.getIfmmSeq());
/* redirectAttributes.addFlashAttribute("dto", dto); */
redirectAttributes.addFlashAttribute("vo", vo);
return "redirect:/member/memberView";
}
위에
System.out.println("dto.getIfmmId(): " + dto.getIfmmId());
이와같은 코드를 적은이유는 Insert가 제대로 데이터가 넘어오는가를 알기위해서
적은 것이다. 예를들어 다리를 검문할 때 중간 중간 관리인이 서있는것처럼
내가 어느부분에서 실수 했는지 바로 알 수 있다.
vo.setIfmmSeq(dto.getIfmmSeq()); 는 우리의 데이터는 아까 member.java에 넣은것처럼 dto에 다 저장되어있다.
하지만 데이터를 꺼내올때는 vo를 통해서 꺼내와야되는
우리는 vo에 다 일일히 적어줄수 없으니
vo.setIfmmSeq() 안에서 dto.getIfmmSeq() 를 실행시켜주면
vo에서 dto값을 불러오는 착시현상같지만 역발상적인 효과를 볼수가 있다.
redirectAttributes.addFlashAttribute("vo", vo); 다음 코드는
vo값을 모두 불러오라는 Post방식의 코드이다.
정리하자면 우리는 dto에 데이터를 다 저장햇지만 dto를 사용할 수 없어 vo를 빌려서 dto를 모두 출력하게
하는것이라고 생각하면 되겠다.
memberForm.jsp
<input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy" value="35"> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " value="36"> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" value="37"> Push
</td>
input에다가 id와 name을 넣어준 이유는 Insert한 데이터가 다음과 같은 방식으로
매핑을 시키기 때문이다. value를 준이유는 코드성 데이터들 이기 때문이다.
나의 코드성 데이터에는 35 , 36 , 37 에 Email, sns, push가 들어있다.
memberView.jsp
<c:choose>
<c:when test="${rt.ifmmEmailConsentNy eq '35'}">
<input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy" <c:out value="${rt.ifmmEmailConsentNy}"/> checked disabled> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " <c:out value="${rt.ifmmSmsConsentNy}"/> disabled> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" <c:out value="${rt.ifmmPushConsentNy}"/> disabled> Push
</c:when>
<c:when test="${rt.ifmmSmsConsentNy eq '36'}">
<input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy" <c:out value="${rt.ifmmEmailConsentNy}"/> disabled> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " <c:out value="${rt.ifmmSmsConsentNy}"/> checked disabled> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" <c:out value="${rt.ifmmPushConsentNy}"/> disabled> Push
</c:when>
<c:when test="${rt.ifmmSmsConsentNy eq '37'}">
<input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy" <c:out value="${rt.ifmmEmailConsentNy}"/> disabled> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " <c:out value="${rt.ifmmSmsConsentNy}"/> disabled> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" <c:out value="${rt.ifmmPushConsentNy}"/> checked disabled> Push
</c:when>
<%-- <input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy"value="<c:out value="${rt.ifmmEmailConsentNy}"/>" disabled> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " value="<c:out value="${rt.ifmmSmsConsentNy}"/>" checked disabled> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" value="<c:out value="${rt.ifmmPushConsentNy}"/>" disabled> Push --%>
</c:choose>
다음을 보면 c:when 의 쓰임과 c:choose의 쓰임을 알수 있다.
c:choose는 else if 의 느낌 다중가정이 가능하고
c:if는 단일가정만 가능하다.
그러니까 c:choose가 만능 문장이라고 보면되겠다.
다음코드들을 간략하게 설명해주자면
<c:when test="${rt.ifmmEmailConsentNy eq '35'}">
<input type="radio" id="ifmmEmailConsentNy" name="ifmmEmailConsentNy" <c:out value="${rt.ifmmEmailConsentNy}"/> checked disabled> Email
<input type="radio" id="ifmmSmsConsentNy " name="ifmmSmsConsentNy " <c:out value="${rt.ifmmSmsConsentNy}"/> disabled> Sns
<input type="radio" id="ifmmPushConsentNy" name="ifmmPushConsentNy" <c:out value="${rt.ifmmPushConsentNy}"/> disabled> Push
</c:when>
rt.ifmmEmailConsetNy를 출력할건데 그 값이 35랑 같으면
radio데이트에있는 email 과 관련된 라디오박스를 checked하고 disabled하라
라는 의미이다.
결과값
출력하면 다음과같이 나온다.
To be continue..
'Front' 카테고리의 다른 글
[Spring] org.springframework.web.servlet.dispatcherservlet - context initialization failed 오류 해결 (0) | 2022.04.21 |
---|---|
[Spring] 코드성 데이터 공통코드 선언 (0) | 2022.04.08 |
[Spring] Membermpp.xml 파일 절대사항 (0) | 2022.04.06 |
[Spring] 자바와 데이터베이스 연동하기 위한 작업 (0) | 2022.04.04 |
[Spring] CRUD에서 Delete 구현 및 적용 (0) | 2022.04.01 |