분류 전체보기 106

aws load balancer를 rest api 서버에 사용하는 경우 주의할 점

aws의 로드밸런싱 서비스를 이용하려 했다. 발급받은 무료 도메인으로 접속해도, aws ec2의 퍼블릭 ip로 접속해도 같은 문구가 나왔다. 502 bad gateway. aws ec2 콘솔의 사이드바에 있는 로드 밸런싱 대상 그룹에서 healthy가 아니라 unhealthy인지 확인할 필요가 있다. 필자는 처음에 Healthy check의 path에 '/'를 작성했었다. aws에서 해당 경로로 요청을 보내 제대로 200 응답이 오는 지 테스를 한다. 그러나 필자의 서버는 rest api라 '/' 경로에 해당하는 응답이 없었다. 그러니 200 응답이 가지 않았고 unhealthy였던 것이다. 그래서 '/api/v1'로 바꿔줬더니 healthy로 바뀌었다. path를 바꿔도 healthy로 바뀌기까지 체감..

js 2021.09.04

인스타그램 프로필 화면 같은 멀티 탭 만들기 - React Navigation 혹은 TabView를 ScrollView로 감싸지 마세요

React Navigation 혹은 TabView를 ScrollView로 감싸지 마세요 저는 이 행동으로 인해 오전을 날렸습니다. react native tab view의 github README에 보면 ScrollView로 감싸지 말라는 말이 있습니다. 읽어보니 최적화만 좀 안 되는 거라는 생각을 하게 됩니다. 일단 테스트니까 그냥 시도해보자고 생각할 지도 모르겠습니다. 하지만 그 순간 에러 지옥으로 빠지는 것입니다. 상단 탭바를 위해 react navigation의 material top navigator를 사용했습니다. const Tab = createMaterialTopTabNavigator(); {/* 썸네일 */} {/* 썸네일 없으면 기본 icon 표시 */} {/* 닉네임 */} {myIn..

프로젝트/튜토 2021.08.22

아찔한 리액트의 무한 요청

// 시작할 때, 프로필 편집 화면에서 뒤로 왔을 때 fetch useEffect(() => { const fetchMyInfo = async () => { try { const result = await getMyInfo(); setMyInfo(result.data); } catch (err) { alert("예상치 못한 문제가 발생했습니다."); } }; fetchMyInfo(); }); 프로필 편집 후 뒤로 왔을 때 단순히 refetch하면 간단할 것이라 생각했다. 그래서 useEffect의 두번째 인자인 업데이트 트리거 배열을 []에서 아예 없애버렸다. 그랬더니 setMyInfo에 의해 state가 변하면서 계속 useEffect 함수가 호출된다. 노트북이 뜨거워지길래 뭐지 싶었는데 서버 로그를 ..

프로젝트/튜토 2021.08.21

데이터베이스 이모지 관련 에러 해결 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '=' 에러가 aws RDS에서 발생했을 때 해결

mysql 공식문서에 따르면 collation 디폴트 값은 utf8mb4_0900_ai_ci입니다. The default MySQL server character set and collation are utf8mb4 and utf8mb4_0900_ai_ci 필자는 아래와 같은 과정으로 aws RDS에 mysql DB을 올려놨습니다. mysql 워크벤치를 통해 ERD을 만들고 forward를 통해 로컬 db와 동기화를 시켜줬습니다. 그 다음 sequelize-cli의 seed 명령어를 통해 데이터를 생성해줬습니다. 서버 내부에서는 sequelize-auto를 사용해서 만들어진 데이터베이스 구조를 사용했습니다. 이 구조에 charset, collate 옵션을 utf8mb4, utf8mb4_general_ci..

DB 2021.08.20

효율성 테스트에서 낙제라면 고려해볼 방법

정확도 테스트에서는 맞는데 효율성 테스트에서 실패한다면 시간 복잡도를 줄여야 합니다. 트리나 그래프의 문제를 제외하면 대부분의 문제는 시간 복잡도 O(N^2)으로 풀 것입니다. 하지만 효율성이 좋지 못하다는 것은 O(N) 알고리즘이 존재할 가능성이 있다는 것입니다. O(N^2) => O(N) 바꾸는 알고리즘 스택 해시 그리디 투 포인터 모든 문제에 이 알고리즘들이 적용되지는 않겠지만 배열을 사용하는 문제라면 이 세 알고리즘들로 시간 복잡도를 줄일 수 있을 지도 모릅니다.

context는 별도의 파일에서 관리해야겠어요

App.js에서 시작하자마자 로그인 여부를 확인하려고 App 파일에 코드를 전부 작성했습니다. const AuthContext = createContext(null); export default function App() { const [state, dispatch] = useReducer( (prevState, action) => { switch (action.type) { case "SET_TOKEN": return { ...prevState, token: action.token, }; } }, { // isLoading: true, token: null, loginFailed: false, } ); const authMethods = useMemo( () => ({ signIn: async (ema..

utf8mb4_general_ci와 utf8mb4_unicode_ci

ci는 무엇일까? case insensitive sorting and comparison에서 앞 두 단어의 앞 글자를 따서 만들어졌다. 대소문자 가리지 않는 정렬, 비교 방식이라는 의미이다. 차이는 무엇일까? utf8mb4_unicode_ci는 general_ci보다 나중에 나왔다. 둘은 비교와 정렬에 사용하는 알고리즘에 차이가 있다. utf8mb4_unicode_ci는 utf8mb4_general_ci보다 정렬, 비교 알고리즘이 복잡하다. 그래서 시간은 아주 조오오오금 더 오래 걸리지만 나은 정확도를 보인다. 현대의 컴퓨터는 충분히 빠르기 때문에 차이를 느낄 수 없는 속도라고 한다. 지금은 다른 버전도 나왔다. utf8mb4_0900_ai_ci 보다 자세한 건 stack overflow에서 확인할 수 ..

js 2021.08.17

sequelize-auto로 테이블 생성 시 손수 설정해줘야 할 것들

charset 설정 chartset: "utf8mb4", collate: "utf8mb4_general_ci", 각 테이블에서 필요에 따라 옵션에 위와 같은 설정이 필요하다. utf8도 아닌 utf8mb4가 의미하는 것은 이모지를 허용한다는 것이다. utf8로 설정하면 예기치 못한 버그가 생길 것이다. onDelete 설정 user_id: { type: DataTypes.INTEGER, allowNull: false, onDelete: 'CASCADE', references: { model: 'user', key: 'id', }, }, Foreign key에 해당하는 필드에서 onDelete를 작성해주자. CASCADE를 사용하면 저장된 user_id에 대응하는 데이터가 삭제되면 해당 테이블의 데이터도 ..

js 2021.08.17

sequelize-cli와 sequelize-auto

mysql workbentch를 사용하는 것도 db 모델링하는 좋은 방법이다. 하지만 sequelize-auto로 연동할 경우 init_models.js 수정, 클래스에서 created_at, update_at, defaultValue를 직접 설정해줘야 한다. 하지만 workbentch에서 테이블 간의 관계를 잘 만들어놓았으면 auto가 관계까지 잘 가져온다. mysql workbentch에 created_at, update_at 필드를 만들어주고 default value에 now()를 넣으면 updated_at: { type: DataTypes.DATE, allowNull: true, defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') } 이..

js 2021.08.17