✔️ Hashing 어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것 모든 값에 대해 해시 값을 계산하는데 오래 걸리지 않아야 한다. -> 변환이 한 시간 걸린다면 로그인도 한 시간 걸린다는 뜻 최대한 같은 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다. ✅ 대표적인 해싱 알고리즘 MD(Message Digest) - MD4, MD5, MD6 SHA(Secure Hash Algorithm) - SHA-1, SHA-256, SHA-512 RIPEMD(RIPE Message Digest) WhirlPool ❗️ 이미 보안이 뚫린 해시 함수가 존재하므로 주의하여 사용해야 한다. ex) MD5, SHA-1, HA..
로컬 환경에서 인증서를 생성하고, 인증서를 이용하여 HTTPS 서버를 만들어 보자 ✔️ 인증서 발급 자바는 두 가지의 인증서 형식을 지원한다 PKCS12 (Public Key Cryptographic Standard #12) : 여러 인증서와 키를 포함할 수 있으며, 암호로 보호된 형식 (업계에서 널리 사용됨) JKS (Java KeyStore) : PKCS12와 유사하다. 독점 형식이며, Java 환경으로 제한된다. ✅ macOS 기준, Homebrew를 이용하여 인증서를 발급받을 수 있다 # mkcert를 설치한다. $ brew install mkcert # firefox를 사용할 경우 필요에 따라 설치해주세요. $ brew install nss ✅ 인증서 생성 로컬을 인증된 발급기관으로 추가한다. ..
👉 A 씨는 커피 주문 앱으로 아이스 아메리카노를 선택하고 결제 버튼을 누른 후, 주문이 진행되는 중에 네트워크 오류로 인해 결제를 완료하는데 실패했습니다. 그런데, A씨가 주문한 커피는 정상적으로 데이터베이스에 등록이 되었습니다. 이 경우, 카페를 운영하는 쪽에서는 판매 수익을 얻지 못하는 손해를 보게 됩니다. ✔️ 트랜잭션 (Transaction) 이란 ? 위의 사례를 예방하기 위해 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 단위입니다. 즉, 여러개의 작업들을 하나의 작업으로 보고 전부 성공해야만 실제 데이터에 반영하도록 하는 것입니다. 전부 성공하든가 전부 실패하든가(All or Nothing)의 둘 중 하나로만 처리되어야 트랜잭션의 의미를 가질 수 있습니다. -> 하나라도 실패하면 모두 ..
로컬 개발환경과 서버 환경을 따로 Profile을 설정해보자 프로젝트 폴더 내의 src/main/resources 에 보면 application.properties 라는 파일에서 Profile을 설정하는데 본인은 .yml 형식을 선호하므로 application.yml 형식으로 바꾸어 주었다. (뭐로 사용하든 관계없음) 사진과 같이 복사해서 2개의 파일을 더 만들어 준다. local 이라고 되어있는 파일에는 로컬 개발환경의 profile을 설정해주고 # 예시) 로컬 환경에서 사용하는 정보들은 application-local.yml 파일에 설정 spring: h2: console: enabled: true path: /h2 datasource: url: jdbc:h2:mem:test jpa: hibernat..
연관 관계 매핑은 참조하는 방향성을 기준으로 단방향과 양방향으로 구분할 수 있다 그리고 엔티티 간에 참조할 수 있는 객체의 수에 따라서 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)로 나눌 수 있다 단방향 연관 관계 한쪽에서만 참조할 수 있는 경우 Member 클래스가 Order 객체를 원소로 포함하고 있으므로, Order를 참조할 수 있다 하지만 Order 클래스는 Member 클래스에 대한 참조 값이 없으므로 Order 입장에서는 Member의 정보를 알 수 없음 양방향 연관 관계 서로 참조할 수 있는 경우 Member 클래스는 Order 객체들을 원소로 포함하고 있고 Order 클래스도 Member 객체를 가지고 있으므로 서로 참조할 수 있다 일대다 (1:N) 일(1)에 해당..
@Entity 클래스 레벨에 @Entity 애너테이션을 붙이면 JPA 관리 대상 엔티티가 된다 -> 데이터베이스의 테이블이 된다는 뜻 애트리뷰트 name 엔티티 이름을 설정할 수 있음 name 애트리뷰트를 설정하지 않으면 기본값으로 클래스 이름을 엔티티 이름으로 사용한다 import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity(name = "USERS") // 엔티티명을 USERS로 설정 @Table(name = "USERS") // 테이블명을 USERS로 설정 public class Member { @Id private Long memberId; } @Table 테이블의 이름을 ..
JPA란 ? Java 진영에서 사용하는 ORM 기술의 표준 사양 - Java의 인터페이스로 사양이 정의되어 있음 Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불림 Hibernate ORM JPA 표준 사양을 구현한 구현체 (이 외에도 EclipseLink, DataNucleus 등이 있음) 데이터 액세스 계층에서의 JPA 위치 데이터 액세스 계층의 상단에 위치함 데이터 저장, 조회 등의 작업은 JPA를 거쳐 JPA의 구현체인 Hibernate ORM을 통해서 이루어지며 Hibernate ORM은 내부적으로 JDBC API를 이용해서 데이터베이스에 접근한다 영속성 컨텍스트 (Persistence Context) JPA의 P에해당하는 Persistence..
Aspect Oriented Programming 관점 지향 프로그래밍 어떠한 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 그 관점을 기준으로 각각 모듈화 하는 것 OOP 모듈화의 핵심 단위는 클래스 AOP 모듈화의 핵심 단위는 관점(Aspect) AOP는 기존에 사용하던 OOP를 대체하기 위한 것이 아닌 횡단 관심사를 깔끔하게 처리하기 위해 OOP의 부족한 부분을 보조하는 목적으로 개발됨 AOP가 필요한 이유 소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 함 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요함 OOP 방식의 프로그래밍을 했을 때 여러 곳..