deedee0905 / CreateType

0 stars 0 forks source link

창작컨텐츠 판매 / 후원 기능 #21

Open deedee0905 opened 1 year ago

deedee0905 commented 1 year ago

창작컨텐츠 판매 / 후원 기능

deedee0905 commented 1 year ago

어제 포인트를 충전하는 결제 관련한 api를 만들었고 오늘은 충전된 포인트로 개인 창작 컨텐츠를 구매하거나 후원하는 기능을 만드려고 하였다.

원래는 pointCharge 테이블과 postPurchase 테이블을 따로 두고 관리하려고 했으나 데이터를 관리하는 부분에 있어서 테이블이 나눠져있으면 오히려 더 관리가 어려울 것 같아서 아예 하나의 테이블로 합치기로 하였다.

추가되는 컬럼이 post를 구별하기 위한 postId 컬럼 밖에 없었고 포인트를 충전하는 부분에 있어서도 null로 설정한 컬럼에는 기본값을 주면 되는 부분이다보니 api를 따로 운용해서 처리하기에 이 편이 더 수월할 것 같았다.

기존에 사용하던 pointCharge 테이블을 드랍하고 새로운 테이블을 만들어서 포인트 충전 api가 정상 작동 되는지를 확인하였다.

api는 정상적으로 잘 작동되었지만, 예상치 못한 에러가 발생했는데 1

이러한 에러가 발생하였다.

캡처1 내용을 읽어보니 데이터를 읽어오는 db 테이블에 값 자체가 null이라 view 화면에 데이터를 출력할 수 없어서 에러가 나고 있었다. point/charge/view로 들어가서 포인트 충전 api를 사용하고 db에 값이 들어가니 해당 문제는 해결이 되었다.

캡처2

다만, 아예 포인트 자체가 아직 없는 로그인한 이용자일 경우에는 동일한 에러가 계속 발생하게 되어 이 에러를 잡기 위해 코드를 수정하였다.

오늘 처음으로 dead code 라는 에러 메세지를 보았는데 검색을 해보니 절대로 수행 될리가 없는 코드라고 정리가 되어있었다.

만약에, db테이블에서 읽어오는 정보가 null 이라면 point 라는 변수에 일괄적으로 0이라는 값을 저장하게끔 코드를 작성하고 싶었는데 dead code 오류가 나서 다시 에러메세지를 찬찬히 읽어보았다.

DAO에서 반환되는 값 자체가 null인데 이를 받아서 다음 과정을 수행하는 bo의 타입이 int라 에러가 나는듯 하여 controller와 bo, dao에서 모두 데이터 타입을 Integer 래퍼클래스로 변환하였다.

이렇게 코드를 수정하니 머릿속으로 구상한대로 코드가 수행되었다!!!

캡처3

deedee0905 commented 1 year ago

캡처1 캡처2

post 테이블의 price가 0이 아닐 경우, content 컬럼에 있는 내용이 보이지 않고 구매하기Btn이 표시되도록 jsp 코드를 수정하였다.

구매하기Btn 클릭 이벤트 유효성 검사까지 마쳤으니 이제 포스트를 구매하여 point 테이블에 기록을 할 수 있는 api의 구성을 생각해보고 만들어야겠다.

deedee0905 commented 1 year ago

캡처3

캡처4

구매하기 api를 활용할때에 전달해야하는 parameter 값이 정상적으로 가져와 지는 부분을 확인하였다. (순서대로 methodOfPayment, price, postId 컬럼에 저장될 값)

캡처5 캡처6 캡처7

구매하기btn을 눌렀을 때에 modal을 활용하여 현재 보유하고 있는 포인트와 구매에 사용되는 포인트, 그리고 결제하고 났을때의 남은 포인트들이 나타나게끔 페이지를 구성해보았다 (보유포인트는 임의적으로 데이터 값을 셋팅했기 때문에 selec api를 사용해서 값을 셋팅해야한다.)

포스트를 구매하고 유저탭 > 포인트 view 페이지에서도 로그인한 유저가 보유하고 있는 포인트 값이 정확하게 출력되는 부분까지 확인하였다.

기능 자체가 어려운건 아닌데 포스트 구매 관련은 경우의 수가 많아서 좀 더 꼼꼼하게 들여다보며 코드를 작성해야 할 것 같다.

deedee0905 commented 1 year ago

*차례대로 정리해서 만들어야하는 기능 정리

deedee0905 commented 1 year ago

연결해야하는 기능의 경우의 수가 많아서 우선 바로 떠오르는 큰 틀부터 정리해보았다.

로그인한 계정이 보유하고 있는 포인트보다 구매시 사용해야하는 포인트가 큰 경우에는 api가 호출되지 않고, 포인트가 부족하다는 alert 이벤트 이후에 return이 될 수 있도록 코드를 수정하였다.

그리고 로그인 시, 세션에 저장되는 userId의 값이 post 테이블에 저장되어있는 userId와 같을 경우 구매하기 btn이 노출되지 않고 post 테이블의 content가 그대로 출력되게끔 jsp 코드를 추가하였다.

deedee0905 commented 1 year ago

캡처1 캡처2 캡처3

로그인한 사용자가 아닐 경우, 구매하기Btn을 눌렀을 시 alert 이벤트를 발생시키도록 코드를 작성하였다. 그리고 바로 로그인 view 페이지로 이동할 수 있도록 페이지 이동 흐름을 만들어보았는데 예상했던대로 잘 처리가 되었다 :-) !

deedee0905 commented 1 year ago

캡처1 캡처2

post테이블의 id 컬럼 값과 세션에 저장된 userId의 값으로 point 테이블을 조회하도록 쿼리를 작성하였다. select count 쿼리를 수행하였을 때, count 되는 값이 있다면 구매한 포스트라고 인식하고 post content 가 노출될 수 있도록 하였고,

count 되는 값이 null 이라면, 구매하지 않은 포스트로 인식하게 하여 구매하기btn이 도출되도록 하였다.

꽤 여러가지 경우의 수에 대한 코드를 작성해야 했기 때문에 이것저것 중간에 헷갈리는게 많은 작업이었지만 다 해내고 나니 모티브로 삼고있는 포스타입과 정말 유사해진듯하다 ㅎ.ㅎ

deedee0905 commented 1 year ago

캡처3 캡처4

후원하기 api에서 활용할 parameter를 정리해보니 구매하기 api와 동일하여 이미 만들어둔 api를 활용하기로 하였다.

methodOfPayment 컬럼에만 '후원' 이라고 값이 저장되면 될 것 같아서 그대로 api를 재활용해보았는데 원하는 결과값이 만들어졌다.

캡처5

이제 methodOfPayment 에 저장된 데이터값이 구매 또는 후원인 데이터들을 전부 추출하여 노란색으로 칠한 부분에 데이터를 넣는 작업을 해야겠다

deedee0905 commented 1 year ago

캡처1

캡처2

로그인한 사용자의 userId값을 패러미터로 받아 point 테이블에 있는 userId 컬럼과 일치하는 값 중, methodOfPayment에 저장된 값이 '구매' 이거나 '후원' 으로 되어있는 목록을 view 화면에 출력하도록 코드를 작성하였다.

a태그 href 속성을 부여해서 페이지 이동을 할 수 있도록 연결하는 부분도 진행하였다.

deedee0905 commented 1 year ago

포인트를 이용하여 포스트를 구매하거나 후원하는 기능까지는 다 만들어졌는데... 이제 이렇게 판매된 포스트의 작성자가 얼마만큼의 수익을 냈는지에 대한 view 페이지와 그 기능들을 설계해야할 것 같다.

뭔가 계속 하고있는데 디테일한 부분을 파고파고 들어가면 계속해서 뭐가 나온다 ㅠㅠ...

지금 가지고 있는 point 테이블을 가지고 수익 부분을 활용하고 싶은데, 현재 point 테이블에 저장된 정보만으로는 전체적인 수익 부분을 확인하기가 어려워 channelId 컬럼을 추가해야할 것 같다.

컨텐츠를 구매하거나 후원할 경우에 channelId값도 같이 저장하게끔 하고 수익 부분에서는 channelId 컬럼에서 로그인한 사용자의 channelId 값을 패러미터로 전달하여 수익 내역을 확인하려고 한다.

결국 point 테이블을 다시 드랍하고 ㅠ.ㅠ 다시 만들어야하는거~~~ 첨부터 설계를 잘!! 꼼꼼히!!!!! 하는게!!!!!!!!!!!!!!!!! 많이 중요하구나....