목록프로젝트 (21)
나의 발자취

개발하려는 사항유저가 이미 참여하고 있는 챌린지면, ChallengeDetailView에서 "나도 참여하기" 버튼이 보이면 안되고 대신 progress bar, 그리고 카메라 버튼이 보여야한다.유저의 챌린지 참여 상태를 계속 기억해야하고, 유저의 챌린지 참여 기간이 끝날때까지 유저는 이 뷰를 봐야한다.유저가 참여중인 챌린지는 챌린지 뷰모델에서 fetchParticipatingChallenges, isParticipatingIn 와 관련되어있다. 일단, 챌린지 디테일 뷰에서, 챌린지 뷰모델을 참고하고 있다.이 뷰 모델의 어노테이션을 ObservedObject에서 StateObject로 바꿔준다. 1. @ObservedObject뷰가 다시 그려질 때마다 새로운 인스턴스가 생성될 수 있음부모 뷰로부터 전달받..

contextMenu는 iOS에서 3D Touch나 길게 눌렀을 때 나타나는 팝업 메뉴다. 사진을 3d 터치로 눌러서 신고하기 버튼을 누른다고 할 때 나타나는 바로 여기다. 내 앱은이미지를 길게 누르거나 3D Touch하면"신고하기" 옵션이 포함된 메뉴가 팝업으로 나타나고그 메뉴에서 "신고하기"를 선택하면 ReportView가 표시되는 구조이다. 문제 상황현재 ChallengeImagesGrid.swift에서 '신고하기'를 누르면 아래와 같이 바로 접수 화면으로 넘어가야하는데, 로딩이 오래걸리는지 뭔지 흰 화면만 뜨는것이다. 지금 상황은 contextMenu 안에서 showReportView.toggle()을 호출그리고 별도의 .sheet modifier에서 ReportView를 표시이 구조에서 ..

generateTestData를 만들어주고 이미지를 랜덤으로 가져오도록 했다.그리고 미안하지만 user id 1은 희생양이 되었다. 하루에 하나의 사진만 업로드가 가능하므로, 벌크 업로드를 위해 createdAt을 오늘 날짜랑 겹치지 않게 바꾸어주었다. 그리고 일단 테스트를 위해 챌린지 id = 11에다가 넣어주었다. 마지막으로, 터미널에서 파일을 실행해준다. 그럼 아래와 같이
스위프트를 하면서 심심찮게 \.self 나 \.dismiss를 볼 수 있다. 이는 KeyPath인데, KeyPath는 타입의 특정 속성을 참조하는 방법입니다. 쉽게 말해서 "경로"를 나타내는 것 예시는 이렇다.struct Person { let name: String let age: Int}let people = [ Person(name: "Kim", age: 25), Person(name: "Lee", age: 30), Person(name: "Park", age: 35)]// 1. KeyPath 사용let names = people.map(\.name) // ["Kim", "Lee", "Park"]// 위 코드는 아래와 동일:// let names = people.map ..
// 2-1. 챌린지 이미지 조회 APIconst getChallengeImages = async (req, res) => { const { challengeId } = req.params; const { page = 1, limit = 20 } = req.query; // 페이지네이션 적용 try { const images = await ChallengeImage.findAndCountAll({ where: { challenge_id: challengeId }, include: [{ model: User, attributes: ["nickname", "profile_picture"] }], order: [["createdAt", ..

이렇게 "status"값이 저장된다. 실제 DB를 확인해보면 이 모든게 공백까지 포함해서 다 ... 저장된다. 보니까 status의 타입이 CHAR(1)로 저장되어서 발생하는 문제였다.따라서 아래와 같이 고쳐줬다. 그런데 이렇게 해도 에러가 났다. 시퀄라이저는 바차를 지원하지 않기 때문에.. 이렇게 바꾸어주었다. 잘 된다그리고선 마이그레이션을 지우고 다시 실행...1. CHAR(1)특징:고정 길이 문자열을 저장데이터 길이가 필드의 정의된 길이보다 짧으면 **빈칸(공백)**으로 채워 저장예를 들어, CHAR(1) 필드에 "A"를 저장하면 길이가 1이므로 그대로 저장됩니다. 하지만, CHAR(5)에 "A"를 저장하면 "A "로 공백이 추가됨장점:고정 길이로 저장하므로 조회 성능이 약간 더 좋다. (주로..

변경 내역일단 신고 테이블이 따로 존재는 하지만, 챌린지 신고의 경우 챌린지 테이블 안에서만 그 수가 계산이 되도록 해놨었다. 신고 당했을 때의 로직을 조금 더 구체화해서,- User에 status 필드 추가: 신고당했을 때 유저의 상태를 크게 세가지 (A:Active, S:Suspended, D:Deactivated)로 나누기로 했다. (D는 유저가 탈퇴했을 때)- 그럼 언제 바꾸나? 신고 유형이 크게 10가지가 있는데, 불법이나 음란물 등 바로 제재를 당해야 하는 것은 신고 누적이 1번만 되어도 바로 조치가 되도록 해야했고, 나머지는 3번 누적이 되어야 이용자 상태가 변경되도록 조치를 하기로 했다.- 마지막으로 신고 당한 유저의 isShow(Post, Comment)의 상태를 false로 하도록 변경..

개인 설정의 마지막 피날레, 프로필 사진 업로드 기능이 남았다.사진 업로드 기능의 경우, 밸런스투표/게시글 작성/챌린지 인증 등 여러 기능에 재사용되기 때문에 재사용 가능한 모듈로 만드느라 좀 고려할 것들이 많았다. 이미지 파일을 업로드하는데, 로컬에 저장하면 그 주소를 string으로 필드에 넣을 수 있지만 그렇게 하고 싶지 않고 바로 DB에 저장하고 싶어서 BLOB 형식으로 지정하느라 모델과 마이그레이션 파일을 다시 수정해야했다.(기존에는 필드 형식이 string으로 되어있었음) BLOB?Binary Large Object 의 약자로, 데이터베이스에서 대용량 바이너리 데이터를 저장하기 위한 데이터 타입을 의미 따라서 모델과 마이그레이션 파일은 BLOB으로 해주는것이 맞다.- 모델-마이그레이션 파일 ..