표준화된 Framework의 단점
·
개발 지식/Trouble Shooting
◾ 문제사항이 애플리케이션의 사용자 인증, 권한 부여 기능은 Spring Security 프레임워크의 Form Login 방식을 통해 간편하게 구현되어 있었다.그리고 로그인 폼을 디자인할 때에는 사용자 입력 항목이 적기 때문에 Modal을 이용해 구현하고 싶었다.하지만!Spring Security에서 제공하는 로그인 방식은 오직 URL을 연결 시켜주어야 했다.즉, Modal을 바로 띄울 수 없고 html 페이지로 만들어야 한다는 것이다.   이 점에서 프레임워크의 표준화된 구조가 애플리케이션의 유연성을 제한한다는 것을 깨달았고, 큰 단점으로 다가왔다. 창의적인 방법이 없을까 고민하며 굉장히 많은 자료들을 찾아보았지만, 대부분 html 페이지 자체를 로그인 화면으로 구성하고 있었다.  ◾ 해결 방안결국 나..
JavaScript에서 데이터 전달하는 4가지 방법
·
개발 지식/Trouble Shooting
∎  요구 사항쇼핑몰 사이트 개발 중Front-End에서 상품 데이터를 장바구니 페이지 -> 주문 페이지로 이동 시켜야 했다.    ∎  해결 방법 조사서로 다른 페이지 간의 데이터 전송 방법을 효율적으로 하고 싶어 다양한 방법을 찾아보았다.2개의 Html 파일 각각에 2개의 JS 파일 모두 연결ES6 모듈을 사용하여 import, export로 원하는 데이터 공유Webpack으로 JS 파일 번들링 후, 데이터를 import, export하여 공유Web Storage에 데이터 저장 ⦁  1번은 제일 간단하지만, 파일 간의 변수 이름이 충돌이 날 수가 있어서 지양하는 방법이었다. ⦁  2번 방법인 ES6 모듈을 사용해보았다. 간단하게 script의 type만 변경해주면 import, export 구문을 사..
Spring Security FilterChain 활용법
·
개발 지식/Trouble Shooting
▪ 배경토큰 인증은 클라이언트가 서버로 토큰을 전송하면, 서버가 이 토큰의 유효성을 확인한다.유효성을 통과하지 못하는 이유는 여러가지가 있다.토큰의 기한이 만료되었을 때토큰이 조작되었을 때지원하지 않는 유형의 토큰일 때이후, 동작 흐름은 AuthenticationEntryPoint 구현체를 호출하고 같은 예외 메시지를 전송하게 된다. 하지만토큰 기한이 만료된 경우에는 클라이언트가 토큰 재발급을 요청할 수 있도록, 서버에서 메시지를 구분해주어야 한다.  ▪  해결 방안기존의 필터 체인은 기본적인 인증과 권한 부여 기능을 제공하지만, 특정 예외 상황을 처리하기에는 유연성이 부족하다는 것을 깨달았다.그래서 필터 체인을 세밀하게 제어할 필요성을 느꼈고, Spring Security 프레임워크에서 FilterCh..
JWT Token을 이용한 인증 / 인가
·
개발 지식/Spring Security
⭕ 사용 목적이 Project의 Front-End는 React로 개발되어 있고, Back-End는 Springboot로 개발 되어있어 Rest API를 통해 통신하고 있다. 두 개의 서로 다른 Framework에서 사용자 인증, 인가를 효율적으로 처리하기 위해 Token 기반의 인증 방식을 사용하였다. Token 기반의 인증 방식이란?Client가 가입된 아이디, 비밀번호로 로그인을 하면 Server는 Client에게 Access Token과 Refresh Token을 준다.그 다음부터는 Client가 권한이 필요한 API에 접근할 때마다 Access Token을 가지고 본인을 인증하여 접근한다.Access Token 안에는 유효 기간과 사용자의 아이디가 들어있다. 그래서 Server에서 Access T..
JPA의 ORM 방법
·
개발 지식/JPA
JAVA로 프로그램을 개발할 때, DB에 접근해야하는 경우가 있다.하지만 이때 문제가 발생한다.JAVA는 객체지향 언어이고, DB는 관계형 데이터베이스이기 때문에 두 기술 사이의 패러다임이 불일치한다.그래서 JAVA 프로그래밍에서 DB를 사용할 때, ORM 기술을 사용한다.  ❓ORM이란?Object Relational Mapping의 약자로, 객체과 관계 데이터 간의 mapping 문제를 해결해주는 기술이다.ORM 기술로 JDBC, Mybatis 등을 많이 사용한다. 하지만 이 기술들을 사용할 때에는 직접 매핑 코드를 다 작성해줘야 하는 과정이 필요하다. Mybatis와 JPA의 차이점JPA는 관계 매핑을 할 때, JAVA에서 객체를 직접 저장하고, 불러올 수 있다.Mybatis를 사용하면 JAVA에서..
Spring Data JPA
·
개발 지식/JPA
∎ 영속화프로그램이 종료되어도 데이터를 저장공간에 영속적으로 저장하기 위한 행위 1. SQL mapping 2. ORM : 객체와 테이블을 매핑시킴JPA : ORM 방식을 명세화한 인터페이스하이버네이트 : JPA 인터페이스를 구현한 클래스-  Spring Data JPA : JPA를 간단하게 만든 기능 (EntityManager 역할도 생략)∎  Spring Data JPA 사용하는 법 1. spring-boot-starter-data-jpa를 의존 설정해준다. 2. spring data jpa를 사용하는데 필요한 설정을 스프링 부트에 해준다. 3. 각 엔티티별로 인터페이스를 만들어준다.이 인터페이스는 repository를 상속하여 만든다.// T : 엔티티 타입// ID : 엔티티의 식별자의 타입pub..
CASCADE (영속성 전이)
·
개발 지식/JPA
∎  CASCADE⦁  객체A를 persist할 때, 그와 관련된 객체B도 한번에 persist하고 싶을 때 (cascade = CascadeType.All)로 세팅해준다.  ⦁  영속성 컨텍스트에 올릴 때, 객체마다 일일이 persist해주기에 번거로워지니까 한번에 persist해주는 방법이다. ⦁  주의 : 객체B가 또다른 객체와 연관이 되어있다면 사용하면 안된다.∎  고아 객체 ⦁   orphanRemoval = true로 설정해주면 부모 객체가 삭제되었을 때, 자식 객체도 자동으로 삭제가 된다. ⦁   특정 엔티티가 개인 소유할 때만 사용하도록 하자∎  CascadeType.ALL + orphanRemovel=true 로 설정하면부모 엔티티가 자식 엔티티의 생명 주기를 완전 관리할 수 있게 된다.
프록시를 이용한 지연 로딩
·
개발 지식/JPA
∎  프록시란?⦁  프록시는 실제 객체 클래스를 상속받아 만들어져있다. ⦁  프록시는 객체를 참조한 값을 가지고 있는 클래스이다. ⦁  프록시는 DB에서 직접 값을 가져오지 않는다. ⦁  프록시는 처음에 한번만 초기화 된다. ⦁  이후, 계속 DB에 접근해 값을 가져오지 않아도 되기 때문에 효율적이다. ⦁  프록시의 타입을 알고 싶을 땐, instance of를 활용한다.   ∎   프록시가 어떻게 값을 가져올까?1. getReference()를 호출하면, 영속성 컨텍스트가 일을 한다.2. 영속성 컨텍스트는 DB에서 값을 조회하여 객체를 새로 생성한다.3. 프록시는 이 생성된 객체를 그때 참조하는 것이다. ∎   프록시를 이용한 지연 로딩연관관계 주인인 객체를 조회하면 관계 되어있는 다른 객체들까지 모두..
의존성 주입 원칙
·
개발 지식/Spring
∎  의존 관계 주입 4가지 (@Autowired)✔ 생성자 주입을 사용해라!한번 밖에 호출 못하므로, 불변에 적합하다.필드를 final로 설정할 수 있다.생성자를 이용하므로, 필수에 적합하다.생성자를 통해 직관적으로 주입하므로, NullPointException을 방지할 수 있다. ✔ set을 통한 주입 ✔ 필드에 @Autowired필드가 private이라 쉽게 주입 불가능사용 추천 안함! ✔ 메서드를 통한 주입여러 필드를 동시에 주입 가능생성자나 setter를 통해 해결가능 하므로 거의 사용 안함!∎   그외주입할 빈이 없으면 오류가 나므로, required를 false로 설정하여 오류를 방지한다. ➜   메소드 자체가 호출 안되게 된다.@Nullable을 이용하면 null값이 나온다.Optional..
Singleton 패턴과 Spring Container
·
개발 지식/Spring
∎  싱글톤 패턴의 필요웹에서 객체 생성을 계속 요청하면 JVM에 메모리 낭비가 심해지므로, 싱글톤 패턴이 되도록 한다.자바의 싱글톤 문법 다시보기!public class 클래스 { private static 클래스 singleton = new 클래스(); private 클래스() {} //생성자 public static 클래스 getInstance() { return singleton; }}static으로 선언해 전역변수로서 프로그램이 끝날때까지 heap영역에 존재하도록 한다.메소드를 통해 객체에 접근하도록 하여 "한개의 객체"를 여러번 사용하도록 유도한다.생성자까지 private하여 접근을 완벽히 막는다.클래스 변수1 = 클래스.getInstance();클래스 변수2 = ..
Junit - 테스트 코드
·
개발 지식/Spring
∎  Junit이란?테스트 케이스 작성하는 프레임워크java 8부터 제공스프링 부트에서 기본 제공 ∎  Annotation  종류 ⦁  @Test : 단위 테스트임을 명시    @Test(timeout=5000) : 실행시간 5000밀리초 초과시 실패  ⦁  given, when, then 구조given : 데이터 준비when : 실행 함수then : 결과 ⦁  @BeforeAll : 전체 메소드들을 실행 전에 한번 실행되는 메소드 ⦁  @AfterAll : 전체 메소드들을 실행 후에 한번 실행되는 메소드 ⦁  @BeforeEach : 각각의 메소드들 실행 전에 무조건 실행되는 메소드 ⦁  @AfterEach : 각각의 메소드들 실행 후에 무조건 실행되는 메소드    ex. 각 메소드 실행 후 저장소 값..
CORS - 다른 출처에서 요청이 왔을 때
·
개발 지식/Web Application
∎  개요프로젝트를 하던 중, 프론트와 백엔드를 서로 다른 프레임워크로 구현하였다.이 두 프레임워크 간의 데이터 통신을 해야하는데 CORS 정책을 지켜줘야 한다고 한다.이 CORS 정책이 뭔지 알아보자~! ∎  CORS (Cross Origin Resource Sharing)브라우저(클라이언트)에서 설정한다.자신과 origin이 다른 곳으로 요청을 못하게 막는다.origin이란, "프로토콜+도메인+포트번호"의 조합으로 각자의 '출처'를 의미한다. ∎  CORS를 하는 이유, 브라우저에서 해야하는 이유CSRF 같은 해킹을 막을 수 있게 도와주는데, 예를 들어 내 이메일로 온 하나의 url을 나도 모르게 클릭했을 때, 나와 출처가 다른 url로 아무 제지 없이 접속이 된다면 내 정보가 바로 흘러들어갈 수 있..
Web 개발 방법의 변화
·
개발 지식/Web Application
먼 거리에서도 빠르게 정보를 주고 받는 요즘, 이것이 가능하기까지 Web programming에는 변천사가 있었습니다.Web programming을 하기 전, 이러한 변천사를 알고 기초부터 탄탄하게 실력을 쌓아보자 1. Web HtmlWeb programming의 첫 시작!초기의 Web은 정적인 프로그램이었습니다. 클라이언트(사용자)는 웹서버에 정보를 요청할 때, Html 페이지 자체를 통으로 요청할 수가 있었고, 웹서버에서는 요청에 맞는 Html 페이지를 리스트에서 검색해 그대로 클라이언트에 전송해 주었습니다.이렇게 정보를 탐색하다보니, 사용자는 '검색'을 하고 싶어졌습니다. 내가 '키워드'를 넣으면 해당 키워드의 결과값들을 얻고 싶은 니즈가 생겼습니다.이러한 이유로 탄생한 것이 Java 진영에서 만든..
MVC 패턴
·
개발 지식/Web Application
MVC는 Front와 Backend를 분리해줄 뿐만아니라,데이터를 받아들이는 입구와 그 데이터를 처리하는 부분도 나누어 주었습니다.   M : ModelV : ViewC : Controller ⦁  Controller는 Model과 View의 중재자 역할을 한다. 그러므로 Model과 View에 대한 내용 모두 가지고 있다. ⦁  Model은 데이터를 담아 놓는 고유영역이다. 그러므로 Controller와 View에 대한 정보가 없어야 한다.  ⦁  View에는 데이터에 관한 정보인 Model의 내용이 섞여 있고, Controller에 대한 내용은 있으면 안된다.  ⦁  View에는 사용자에게 같은 화면을 주기도 하고 다른 화면을 주기도 하는데, 다른 화면을 줄 때 Model의 데이터를 활용하는 것이다...
컬렉션 프레임워크 (List, Set, Map)
·
개발 지식/Java
⦁  java. util 패키지에 포함되어 있다. ⦁  제네릭 타입이다.  ⦁  인터페이스 List, Set, Map은 각각 다음의 클래스들을 가지고 있다.   ⦁  List : ArrayList, Vector, LinkedList  ⦁  Set : HashSet, TreeSet  ⦁  Map : HashMap, Hashtable, TreeMap, Properties  여러 메소드를 사용하기 위해선 인터페이스를 공부하면 된다.∎  List 컬렉션, 인터페이스객체의 번지가 저장된다. index를 통해 접근기본 타입은 boxing되어 번지가 저장된다. ⦁ 사용시작원하는 타입이 있다면 : List list = new ArrayList();여러 타입을 저장할 때 : List list = new ArrayList..
스트림
·
개발 지식/Java
∎  스트림이란?외부 반복자 : List에서 index로 접근하거나, Set에서 Iterator로 접근하는 것은 요소들을 외부로 꺼내와서 작업하는 방식이다. 내부 반복자 : 데이터를 Stream에 넣어주면 데이터가 흘러가면서 외부에서 하나씩 처리된다. 람다식으로 처리한다.➞ 외부 반복자를 사용하면 시간이 더 오래 걸린다.Set set = new HashSet();Stream stream = set.stream();stream.forEach((item) -> { 처리내용 }); // 매개변수가 있어야하므로 t를 넣어준다.  ∎  병렬 스트림List list = new ArrayList();Stream stream = list.parallelStream();stream.forEach(item -> {});여..
멀티 스레드
·
개발 지식/Java
∎  스레드코드의 실행 흐름  ∎  멀티 스레드멀티 스레드에서 하나의 스레드는 나머지 스레드에 영향을 주기 때문에 예외 처리를 잘 해주어야 한다.(ex. 서버 개발, 게임 개발에 많이 사용한다.)자바 프로그램 실행시 JVM이 메인 스레드를 만들어 메인 메소드를 실행한다.현재 실행 중인 스레드가 궁금하면 Thread 클래스를 이용하여 알아낼 수 있다.Thread 클래스를 이용하여 스레드를 작업할 수 있다. ⦁  스레드 생성 (방법1)Thread thread = new Thread(Runnable target);// 생성할 때, Runnable을 구현한 객체를 작성해주면 그것이 생성된다.// Runnable 인터페이스에는 run() 추상 메소드 한개 정의되어 있다.  ⦁  생성된 스레드 대기 상태로threa..
배열
·
개발 지식/Java
∎  배열이란?연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조이다.생성 후에는 배열의 크기(길이)는 변경할 수 없다.배열은 객체이다. ∎  배열 변수 "선언"타입[] 변수; (많이 사용됨)타입 변수[]; ∎  값 목록 넣는 법⦁  타입[] 변수 = {1,2,3, ... }; (O) ⦁  타입[] 변수;변수 = {1,2,3, ... } (X) ⦁  타입[] 변수;변수 = new 타입[] {1,2,3, ... } (O)  ∎  값 목록 없이 배열 변수 선언⦁  타입[] 변수 = new 타입[길이];(기본값이 초기화 되어 저장된다.) ex. 0  배열의 길이 : 변수.length  ∎  다차원 배열"1차원은 선, 2차원은 면"의 개념으로 이해하면 안된다.1, 2, 3차원으로 나아갈 수록..
람다식 - 자바의 함수형 프로그래밍
·
개발 지식/Java
함수와 메소드의 차이 : 함수는 객체와 상관없이 코드를 묶어 놓은 것, 메소드는 객체와 관련하여 기능을 정의한 것 ∎ 함수형 프로그래밍이란?데이터 처리부에서 데이터는 동일하고, 외부에 있는 다양한 함수만 가져와 여러가지 처리를 하는 프로그래밍  ∎  람다식자바8부터 함수형 프로그래밍을 지원하기 위해 만들어진 식으로 람다식은 함수의 내용부분에 해당한다.형태 : (매개변수, ... ) ➞ {처리 내용} ⦁ 하지만 자바는 객체지향 프로그래밍이므로 람다식은 익명 구현 객체에서 사용되어야 한다! ⦁ 인터페이스를 통해 익명 구현 클래스를 만들 때,인터페이스 변수 = new 인터페이스 { ... };{}안에 람다식을 작성해 준다. ⦁ 결국 자바에서 데이터 처리부는 '메소드'를 의미하고, 그 안의 변수는 데이터를 의미..
추상 클래스와 인터페이스
·
개발 지식/Java
∎  추상 클래스실체 클래스에서 공통적으로 사용될 필드와 메소드를 '예측'해 추상 클래스를 만든다.➞ 클래스들의 가이드를 만들기 위해 (규격의 역할)실체 클래스는 추상 클래스를 상속해 사용한다.내용은 필드와 생성자와 메소드, 추상 메소드이다.생성자는 자식을 편하게 하는 역할이다.직접 객체를 생성 불가하다.class 앞에 abstract를 붙여 만든다.추상 메소드가 있으면 자식은 무조건 재정의 해야한다. 같이 쓰는 경우 : 인터페이스로만 하면 구현 클래스마다 중복 코드가 발생할 수 있어 추상 클래스를 중간에 만들어주면 코드 중복 제거가 가능하다.    ∎ 인터페이스 지금까지는 객체에 직접 접근하여 사용하였지만, 지금부터는 인터페이스를 통해서 객체에 접근하도록 할 것이다.인터페이스를 사용한 구현 클래스가 있..
윤씅
'개발 지식' 카테고리의 글 목록