2024.05.14(화) 슈퍼코딩 부트캠프 백엔드/Spring 네이버 인턴 Day 2 일일보고

usnim·2024년 5월 14일
0

super_coding

목록 보기
12/35

📋 TO-DO LIST

네이버 클라우드 활동 [o]

3주 2일차 강의 [o]

네이버 클라우드 사수 도움 요청 업무 [o]

팀장님 지시 업무 [o]

중간/일일 업무 보고 작성 [o]

정기 팀/동기 스터디 모임 참석 및 성실도 [o]

📍 학습 내용 정리

java 자료형 / 변수

자바에서 자료형과 변수는 서로 연관되어 있습니다.

자료형: 변수에 저장될 데이터의 유형을 정의

변수: 메모리에 할당된 공간에 이름을 부여한 것입니다.

자바의 기본 자료형에는 int, double, boolean, char 등이 있습니다.

묵시적 형변환 & 명시적 형변환

묵시적 형변환은 작은 데이터 유형이 큰 데이터 유형으로 자동으로 변환되는 것을 말합니다.

예를 들어, intdouble로 변환할 때 발생합니다.

명시적 형변환은 큰 데이터 유형을 작은 데이터 유형으로 변환할 때 사용되며, 이때는 형변환 연산자를 사용해 명시적으로 변환합니다.

java 리터럴

자바의 다양한 리터럴에는 정수형 리터럴(10진수, 8진수, 16진수), 부동소수점 리터럴(실수), 논리형 리터럴(true, false), 문자 리터럴('A', 'B'), 문자열 리터럴("Hello, World!") 등이 있습니다. 리터럴은 코드에서 사용되는 고정된 값으로, 변수에 할당될 수 있습니다.

public class DataTypeExample {
    public static void main(String[] args) {
        // 자료형과 변수
        int num1 = 10; // 정수형 변수 선언
        double num2 = 5.5; // 실수형 변수 선언
        boolean isTrue = true; // 논리형 변수 선언
        char letter = 'A'; // 문자형 변수 선언

        // 묵시적 형변환
        int smallNum = 5;
        double bigNum = smallNum; // 묵시적 형변환 발생

        // 명시적 형변환
        double bigDecimal = 10.5;
        int smallInt = (int) bigDecimal; // 명시적 형변환

        // 다양한 리터럴
        int decimal = 10; // 10진수 리터럴
        int octal = 010; // 8진수 리터럴
        int hex = 0x10; // 16진수 리터럴
        double floatingPoint = 3.14; // 부동소수점 리터럴
        boolean boolLiteral = true; // 논리형 리터럴
        char charLiteral = 'B'; // 문자 리터럴
        String stringLiteral = "Hello, World!"; // 문자열 리터럴
    }
}

📍 일일보고

부족한 점 : 라이브러리의 사용방법만 알고 구현하려던 문제

스스로 시도해본 것들 : wordSearch 웹사이트 구글 로그인 구현

from fastapi import FastAPI, Request, WebSocket
from fastapi.responses import JSONResponse, RedirectResponse
from authlib.integrations.starlette_client import OAuth
import os
import requests
import jwt
from dotenv import load_dotenv
oauth = OAuth()

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
load_dotenv(os.path.join(BASE_DIR, ".env"))

google_client_id = os.getenv("GOOGLE_CLIENT_ID")
google_client_secret = os.getenv("GOOGLE_CLIENT_SECRET")
google_redirect_uri = os.getenv("GOOGLE_REDIRECT_URI")

app = FastAPI()

@app.get("/google/login")
async def login_google():
    return {
        "url": f"https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={google_client_id}&redirect_uri={google_redirect_uri}&scope=openid%20profile%20email&access_type=offline"
    }

# auth_google 함수 수정
@app.get("/oauth/google")
async def auth_google(code: str):
    token_url = "https://accounts.google.com/o/oauth2/token"
    data = {
        "code": code,
        "client_id": google_client_id,
        "client_secret": google_client_secret,
        "redirect_uri": google_redirect_uri,
        "grant_type": "authorization_code",
    }
    response = requests.post(token_url, data=data)
    access_token = response.json().get("access_token")
    user_info = requests.get("https://www.googleapis.com/oauth2/v1/userinfo", headers={"Authorization": f"Bearer {access_token}"})

    if response.status_code == 200:  # 데이터를 성공적으로 가져왔을 때
        user_data = user_info.json()
        user_email = user_data.get("email")
        user_name = user_data.get("name")
        user_id = user_data.get("id")
        jwt_payload = {"email": user_email, "user_id": user_id}  # 사용자 정보와 식별자를 포함한 payload
        jwt_token = jwt.encode(jwt_payload, mysecret_key, algorithm="HS256")
        js_code = f'localStorage.setItem("jwt_token", "{jwt_token}")'
        # 클라이언트 주소로 리다이렉트
        redirect_url = "http://localhost:5173?jwt_token=" + jwt_token
        return RedirectResponse(url=redirect_url)
    else:
        return JSONResponse(content={"error": "Failed to fetch data"}, status_code=500)

해결 내용 : 원래는 authlib 이라는 라이브러리를 사용해서 손쉽게 작성하려 했으나 업데이트 된 문제도 있고 공식문서에 나온

방법으로는 구현이 안되는 문제가 있어 Google console에서 redirect uri를 설정하고 redirect uri를 담은 url을 클라이언트에게 전송

알게된 점 : 쉽게 사용하는 라이브러리가 있지만 익숙하지 않다면 처음부터 소셜 로그인을 하는 플랫폼에 가서 공식문서를 확인하고 직접 처음부터 해보는것이 학습에는 더 도움이 된다는 것

헷갈리거나 실수한 점 : 처음에는 redirect uri를 클라이언트 주소로 지정해서 구글 계정의 유저 데이터를 가져오는데 삽질을 2시간 넘게했다.

생각해보건데 클라이언트 주소로 리다이렉트를 했다면 Svelte 같은 경우는 onMount를 사용해 바로 fetch를 사용해서 데이터를 가지고 오는 서버와 연결했어도 좋을거 같다.

회고 : 자바관련된 기본 문법과 변수 등에 대해 학습하고 나머지 시간에 진행하던 프로젝트의 기능들을 만드는 시간이 늘어나니 하루가 정말 빠르다.
의자에 오래 앉아있으면 있을수록 내가 최선을 다하고 있구나라는 생각이 든다.
지금 겪고 있는 것들이 좋은 습관으로 오랫동안 유지되었으면 한다.

profile
🤦‍♂️

0개의 댓글