728x90

개발 295

로그인 세션, 토큰 장단점

로그인 세션 방식과 토큰 방식은 모두 사용자 인증과 권한 부여에 사용되는 인증 방법 로그인 세션 방식: 장점: 보안성: 로그인 세션 방식은 세션 ID를 서버 측에서 관리하기 때문에 보안성이 높다. 사용자 인증 정보가 브라우저에 저장되지 않으므로, 쿠키 탈취 등의 보안 위협에 취약하지 않다. 적용 범위: 로그인 세션 방식은 모든 웹 애플리케이션에서 사용할 수 있다. 단점: 성능: 로그인 세션 방식은 서버에서 세션 정보를 유지하기 때문에 서버 부하가 증가할 수 있다. 또한, 매 요청마다 세션 ID를 서버에서 검증해야 하므로 네트워크 대역폭도 증가한다. 확장성: 로그인 세션 방식은 클러스터링 및 로드 밸런싱과 같은 서버 확장성 문제가 있다. 토큰 방식: 장점: 보안성: 토큰 방식은 토큰을 브라우저에 저장하고,..

개발/ETC 2023.04.22

[Java] 클래스, 추상클래스, 인터페이스 차이

클래스, 추상클래스, 인터페이스는 객체 지향 프로그래밍(OOP)에서 사용되는 개념으로, 각각의 특징과 용도에 따라 차이가 있다. 클래스 (Class) 클래스는 객체를 생성하기 위한 템플릿이며, 객체의 상태와 동작을 정의하는데 사용된다. 클래스는 객체를 생성하는데 사용되는 구체적인 속성과 메서드를 포함하며, 객체는 클래스를 기반으로 생성된다. - 객체(Object) 객체는 클래스를 기반으로 생성된 실체. 클래스의 인스턴스라고도 함. 객체는 클래스의 속성과 동작을 가짐. 객체는 메모리에 할당되어 실행 중인 프로그램에서 실제로 동작함. 객체는 독립적으로 자신의 상태를 가지고 메소드를 호출하거나, 다른 객체와 상호작용할 수 있다. 추상클래스 (Abstract Class) 추상클래스는 클래스의 한 종류로, 인스턴..

Inner Join, Outer Join 차이

inner join, outer join은 둘 다 관계형 DB에서 사용되는 sql 쿼리의 join 연산자인 것이 공통점. 차이점은 1. Inner Join은 두 개의 테이블에서 일치하는 행들만 보여줌. ( 교집합 ) 예를 들면, 고객 테이블과 주문 테이블이 있을 때, Inner Join을 사용하면 고객과 주문 테이블에서 동시에 고객 정보와 주문 정보가 있는 행들만 보여준다. 2. Outer Join은 두 개의 테이블에서 일치하지 않는 행들도 보여줌. ( 합집합 ) Outer Join은 Left, Rigth, Full 세 가지로 나뉜다. - Left Outer Join: 왼쪽 테이블의 모든 행들과 오른쪽 테이블에서 일치하는 행들을 조합하여 보여줌. 오른쪽 테이블에 일치하는 행이 없는 경우 Null로 처리함..

개발/ETC 2023.04.20

When using COPY with more than one source file, the destination must be a directory and end with a / 해결

Spring boot 프로젝트를 AWS와 Docker Github Action을 사용해서 배포과정 중 만난 에러 그냥 배포를 하게 되면 plain.jar가 생성되는데, 여기엔 우리가 추가한 라이브러리들이 다 빠져있고, 우리가 작성한 코드만 들어있다. 그러다보니 에러가 발생하므로 아래 명령어로 plain.jar 생성을 차단하자 build.gradle에 jar { enabled = false } 추가해준다. -참고 https://dev-j.tistory.com/22

개발/ETC 2023.03.10

Error: Gradle script '/home/runner/work/~' is not executable. 해결

spring boot 프로젝트를 github action을 이용해서 CI는 중 에러가 발생했다. 찾아보니 해결책이 3개 였는데, 3번째는 제외했다. script에서 권한을 주는 방법. - name: Run chmod to make gradlew executable run: chmod +x ./gradlew git 자체에 권한을 주는 방법(터미널로 프로젝트 경로에서 명령어 입력) git update-index --chmod=+x gradlew - 참고 https://spacetech.dk/error-gradle-script-home-runner-work-gradlew-is-not-executable.html

개발/ETC 2023.03.09

refusing to allow a Personal Access Token to create or update workflow 해결

vs코드에서 커밋, 푸쉬 기능을 사용하는데, 이런 에러가 발생했다. github에서 발급받은 Access Token이 권한이 부족해서 발생한 에러다. 이를 해결하기 위해서는 깃헙 계정의 Setting > Developer settings > Personal acess tokens > Tokens (classic) 에서 발급 받은 토큰을 선택해서 workfolw에 체크해주고 update token 클릭하면 이제 잘 된다.

개발/ETC 2023.03.08

[JPA] N+1 해결하기

N+1은 한 번의 쿼리를 요청했는데 여러 번 쿼리가 요청되는 현상을 말한다.(1+N) Book 도메인에 아래와 같이 연관관계가 있었고, (각각 양방향 연관관계) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; private String bookNm; // 도서명 ... @OneToMany(mappedBy = "book", fetch = FetchType.LAZY, cascade = CascadeType.ALL , orphanRemoval = true) private List archiveList = new ArrayList(); @OneToMany(mappedBy = "book..

[React] 상태 변화 로직 분리하기

리액트에서 상태 변화는 useState로 진행하는데, 이게 많을 경우 코드가 길어지고, 유지보수 하는데 불편하다. 이를 좀더 편하게 하기 위해 useReduce()를 통해 개선할 수 있다. 먼저, 리액트에서 CRUD를 작업한다고 하면 const Main = () => { const [data, setData] = useState([]); const [name, setName] = useState(""); const onCreate = () => { ...생략 } const onRead = () => { ...생략 } const onUpdate = () => { ...생략 } const onDelete = () => { ...생략 } } 생략된 코드들이 복잡하고 길 가능성이 있다. 이를 개선하면, Main..

[React] 연산 최적화 하기

1. useMemo() 리액트 Hook 에서 useEffect()와 비슷하게 불필요한 동작을 막기 위해 useMemo()라는 것을 사용한다. 예를 들면, Lifecycle이 시작될 때 배열을 서버로부터 받아와서 useState()로 데이터를 상태를 유지한다고 하면, const [data, setData] = useState([]); const getData = async () => { const response = await fetch("url") .then((res) => res.json()); setData(response); } useEffect(() => { getData(); }, []) 이런 코드를 작성할 수 있다. 여기서 Data 안에 있는 내용을 화면에 보여준다고 하면, const getD..

[React] Lifecycle 제어하기

리액트를 함수형 컴포넌트를 사용하면서 unMount는 어떻게 잡는지 제대로 알지 못했는데, 이번에 공부하면서 알게 되었다. 먼저 Lifecycle이란 화면에 있는 컴포넌트들이 생성될 때 발생하는 과정을 말한다. 이런 과정 제어하는데, Hooks를 사용하면서 클래스형보다 좀 더 편하고 안전하게 사용할 수 있게 됐다. 간단하게 생성 수정 제거 3단계로 나눠서 생성은 화면에 나타나는 것 - Mount 수정은 말 그대로 업데이트(re-render) - Update 제거는 화면에서 사라지는 것 - UnMount 이를 코드로 나타내면 // 생성 & 제거 useEffect(() => { console.log("Mount!"); return () => { console.log("UnMount!"); } }, []); ..

728x90