Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

채채

[4주차]알림 시스템 API 본문

dev-log/web_study

[4주차]알림 시스템 API

HChaeEun 2023. 1. 17. 12:37

Alarm TABLE

ERD를 재구성하고 개발을 시작했다.

 

문제 해결 1

가장 먼저 직면한 문제점은 사용자가 알림을 설정할 때, 장소와 물품 태그 속성을 하나만 선택하는 것이 아니라. 여러개의 값을 넣을 것인데, mySQL과 같은 RDBMS에서는 배열을 그대로 하나의 레코드에 저장할 수 없다. 왜냐하면 이는 제1정규형에 위반되므로 기본적으로 RDBMS에서 제한하기 때문이다.

이러한 문제를 해결하기 위해 배열 형태의 데이터를 String으로 변환 후 DB에 저장하고. 꺼낼 때는 String을 파싱하여 List에 담아 보내는 방법을 택하게 되었다.

 

ref) https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-RDB%EC%97%90-%EB%B0%B0%EC%97%B4%EC%9D%84-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[MYSQL] 📚 RDB에 배열을 저장하는 방법

MySQL에 배열 데이터를 저장 게시판을 제작하는데 있어, 게시글의 내용을 서버에 다음과 같이 보낸다고 가정해보자. 게시글 제목(title)과 게시글 제목(description) 그리고 게시글에 사용된 이미지(thu

inpa.tistory.com

const place = req.body.place;   //배열 자료형으로 받아온 place와 object
const object = req.body.object;

await prisma.users.update({
    where: {
        userId: userId    //userId가 같으면 수정
    },
    data: {
        place: JSON.stringify(place),
        object: JSON.stringify(object)    //place와 object를 JSON클래스를 이용해 배열 문자열로 저장
    }
})

배열로 저장

문제 해결 2

posts 테이블에서 알림 설정한 태그에 맞게 게시글 10개를 alarm테이블에 저장해야한다.

1) prisma에서 10개만 받아오는 문법은 무엇이지?

2) where절에 조건을 and와 or로 거는 법은 뭐지?

3) list로 받아온 데이터를 하나하나씩 찢어서 alarm 테이블에 어떻게 넣을까?

 

해결 1) take: 10

https://www.prisma.io/docs/concepts/components/prisma-client/pagination

const postList = await prisma.posts.findMany({
    select: {
        postId: true,
        place: true,
        object: true,
        title: true
    },
    where: {
        OR: [
            { place: { in: placeArr } },
            { object: { in: objectArr } }
        ],
        AND: [
            { status: 'found' } // 분실물 '발견'. (분실물 신고 '요청' x)
        ]
    },
    orderBy: {
        postId: 'desc'
    },
    take: 10
});

 

해결 2) AND [  ], OR [  ]

https://stackoverflow.com/questions/72566290/how-to-use-where-in-in-prisma

 

How to use where in in Prisma?

I have made a query below that search user using two columns. But it seems not working properly, I assume it is querying the where clause in each column instead of both columns. Is there a way we c...

stackoverflow.com

 

해결 3) for문 이용

//alarm 테이블에 데이터 입력
for (i = 0; i < postList.length; i++) {
    await prisma.alarm.create({
        data: {
            userId: userId,
            postId: postList[i].postId,
            title: postList[i].title,
            place: postList[i].place,
            object: postList[i].object,
            readStatus: "안읽음"
        }
    });
};

postList의 길이만큼 반복하면서 alarm 테이블에 데이터를 넣는다.

 

문제 해결 3 - prisma update

게시물을 읽었는지 안 읽었는지 처리하기 위해 prisma의 update문을 사용했다.

신기하게도 내 컴퓨터에는 오류가 생기지 않았는데, 같은 팀원에게는 오류가 발생했다. 오류가 발생하지 않았더라면 그냥 넘어갈뻔한 개념을 학습하고 넘어가게 되었다.

https://github.com/prisma/prisma/discussions/4185

https://www.prisma.io/docs/concepts/components/prisma-client/crud#update

ref 찾아보니 update의 where절에는 unique한 속성만 들어가야한다. where 절에 userId와 alarmId를 둘 다 넣었기 때문에 다음과 같은 오류가 난 것이다.


해결할 방법을 생각해보니 문득 게시물 읽음처리를 할 때, alarmId 자체가 유일한 속성이니까 userId를 넣지 않아도 될 것같다는 생각이 들었다. 회원이 일치하지 않는데 읽음으로 처리하면 문제가 되는 거 아닌가 싶었는데, 애초에 alarm을 보낼 때 userId 별로 보내도록 코드를 짰기 때문에. userId(2)인 사람이 (1)인 사람의 알람을 받는 경우가 없다.
따라서 where절에는 unique한 속성인 alarmId를 넣어 데이터를 식별하기로 했다.

읽음처리 test

다행히 읽음으로 잘 처리된다.

'dev-log > web_study' 카테고리의 다른 글

[2주차]Redis 구축 및 로그아웃 API 제작  (0) 2023.01.09
[3주차] 댓글 기능 관련 API 제작  (0) 2023.01.09