4주 프로젝트 - dev log #6

Joshua Song / 송성현·2020년 2월 5일
0

im_16 프로젝트

목록 보기
13/21

라우팅 문서 작성 진행 중이다. 파트너 분과 각자 기능을 나눠서 작성하기 시작했는데 querybuilder를 사용해서 route 를 작성하려고 한다. 원래는 그냥 sequelize문 같은 기능으로 find, save를 이용해서 작성하려 했으나 typeORM을 뒤져본 결과 querybuilder 유용하다고 소개를 해 사용해 보기로 하고 코드를 작성했다.

타입스크립트와 연동해서 사용해서 그런지 에러도 많이 났고 공식 페이지에 나온 절차를 따라했는데도 원하는 결과가 나오지 않아 많이 고생했다. 여러가지 방법을 시도해야만 원하는 결과가 나와 속도가 잘 나지 않았고 join을 해서 가져오는 부분도 고생고생해서 해결했다. 처음에는 타입을 any로 지정해 놓고 코딩을 하다가 나중에 어느정도 완성했을 때만 리팩토링을 하기로 결정했다.

router.post("/new", async (req:express.Request, res:express.Response) => {
    const {
        userId, catId, content, photoPath,
    }:{userId:number, catId:number, content:string, photoPath?:string} = req.body;
    try {
        const createConnection:QueryBuilder<any> = await getConnection().createQueryBuilder();
        const addPost:InsertResult = await createConnection
            .insert()
            .into("post")
            .values([
                {
                    user: userId, cat: catId, content, status: "Y",
                },
            ])
            .execute();
        if (addPost.raw.affectedRows === 0) {
            res.status(409).send("Failed to save post");
        }
        // result.identifiers[0].id
        if (!photoPath) {
            res.status(201).send("Successfully added post");
            return;
        }
        const addPhoto:InsertResult = await createConnection
            .insert()
            .into("photo")
            .values([
                {
                    path: photoPath, status: "Y", cat: catId, post: addPost.identifiers[0].id,
                },
            ])
            .execute();
        if (addPhoto.raw.affectedRows === 0) {
            res.status(409).send("Saved post, but failed to save photo");
            return;
        }
        res.status(201).send("Successfully added post");
    } catch (e) {
        res.status(400).send(e);
    }

    //! 사진 데이터를 S3에 저장 후 그 주소를 데이터베이스 저장해야 함. 그 이후에 클라이언트가 요청할 시 주소를 보내줘야 함.
});

쿼리빌더는 기본적인 개념이 로우쿼리문과 비슷하다. 테이블을 가져와 필요하다면 insert로 아니면 select으로, 상황에 맞게 짜주면 된다. 완성된 코드를 보면 깔끔하지만 많은 에러가 있은 후에 탄생한 코드이다. 일단 포스트 라우팅 부분을 짜고 있는데 시간이 많이 걸려 오늘안에 다 짤 수 있을지 모르겠다.

꾸준히 소통을 하고 있고 모르는게 있으면 열심히 찾아보고 있다. 그리고 entity관계를 설정할 때 OneToMany는 사용하려면 ManyToONe이 필요한데 ManyToOne은 OneToMany가 필요하지 않다. 꿀팁.

profile
Grow Joshua, Grow!

0개의 댓글