Notice
Recent Posts
Recent Comments
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

Día de Ruru

20230414 TIL 본문

항해99/TIL

20230414 TIL

공대루루 2023. 4. 15. 04:46

문제점 1. 권한이 일치하지 않는 게시글이 조회되는 에러 발생

분명 어제까지 잘되던 기능이 리펙토링 이후에 묘하게 이상해졌다..

내가 언급된 일정만 따로 조회하는 API에서 조회는 잘 되는데 내가 권한이 있는 mentionId가 아니라 같은 일정이긴 하지만 권한이 다른 팀원에게 있는 mentionId 를 가져오는 경우가 생겼다.. 뭔가 찾아오는 부분에서 findOne을 할 때 내가 원하는 데이터가 아니라 가장 앞에 있는 데이터를 가져오는 것 같다.

해결방안 1

아래의 코드가 내가 처음 작성한 코드이다. 테이블 조회를 애초에 schedules 테이블을 기준으로 했기 때문에 관계성이 연결되어있지 않은 mention 테이블은 따로 조회한 후 assign() 메서드를 활용해서 하나의 객체로 합쳐버렸다...

const schedule = await Schedules.findOne({
            raw: true,
            where: { eventId },
            attributes: [
					//불러올 요소들
            ],
            include: [
                {
                    model: Users,
                    attributes: [],
                },
                {
                    model: Events,
                    attributes: [],
                },
            ],
        });
        const mention = await Mentions.findOne({
            raw: true,
            where: { eventId, userId },
            attributes: [필요한 요소들],
        });
        return Object.assign({}, schedule, mention);  //두개의 배열을 하나로 합치는 메서드

위의 코드를 리펙토링 한 코드가 아래의 코드이다!! Events를 기준으로 테이블 조회를 했더니 각각 연결되어 있던 Users, Schedules, Mentions 테이블을 하나로 조인할 수 있었다. 하지만 이렇게 코드를 작성한 이후로 문제가 생겼다...

const schedule = await Events.findOne({
            raw:true,
            where:{eventId},
            attributes:[
				//필요한 요소들
            ],
            include : [
                {
                    model : Users,
                    attributes : []
                },
                {
                    model : Schedules,
                    attributes : []
                },
                {
                    model : Mentions,
                    attributes : [],
                }
            ]
        })

열심히 콘솔도 찍어보고 디버깅을 해본 결과 Mentions에 있던 필터링 조건중 하나인 userId에 대한 필터링이 없어서 원하는 데이터의 eventId가 같은 것들 중에서 가장 앞에 있는 데이터를 반환하는 것이었다.

const schedule = await Events.findOne({
            raw:true,
            where:{eventId},
            attributes:[
				//필요한 요소들
            ],
            include : [
                {
                    model : Users,
                    attributes : []
                },
                {
                    model : Schedules,
                    attributes : []
                },
                {
                    model : Mentions,
                    attributes : [],
                    where : {userId}
                }
            ]
        })

include 된 테이블 중 Mations 테이블의 필터링 조건을 추가해주었더니 정상적으로 작동했다!!


문제점 2. 회원가입 시 소문자와 대문자를 같은 글자로 인식하는 버그 발생

회원가입 시 aaa123이라는 아이디로 회원가입을 하면 다른 사람이 AAA123이라는 아이디로 회원가입을 하려고 할 때 같은 아이디로 인식하게 되서 에러가 반환된다.

해결방안 2

1. 중복 검사 시 

중복 검사를 할 때에는 데이터베이스에 있는 값들의 대소문자를 구분해서 찾아오겠다는 쿼리문을 작성해주면 된다.

const user =  await sequelize.query(
            "SELECT * FROM Companys WHERE BINARY companyId = ? LIMIT 1",
            {
                replacements: [companyId],
                type: sequelize.QueryTypes.SELECT,
            }
        );

위의 코드에 있는"SELECT * FROM Companys WHERE BINARY companyId = ? LIMIT 1"은 Companys 테이블에서 companyId 가 아래의 replacements 에 있는 값인 것들을 대소문자를 구분해서 하나만 가져오라는 뜻이다. type에는 어떤 쿼리 타입으로 작성하는지 알려주면 된다. 나는 조회만 하면되기 때문에 SELECT라고 써주면 된다.

2. 데이터를 테이블에 입력할 시

중복 검사를 마친다고해도 데이터테이블내에서 중복된 데이터라고 인식해버려서 롤백이되어버렸다. 이 경우 모델에서 대소문자 구분하는 옵션을 추가로 작성해주면 된다!

 userId: {
                allowNull: false,
                primaryKey: true,
                type: DataTypes.STRING.BINARY,
                collate: 'utf8_bin'
            },

'항해99 > TIL' 카테고리의 다른 글

20230419 TIL  (0) 2023.04.20
20230418 TIL  (1) 2023.04.19
20230413 TIL  (0) 2023.04.13
20230411 TIL  (0) 2023.04.12
20230410 TIL  (0) 2023.04.11
Comments