같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열 이라 함.

 

서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다. 

배열을 그림으로 그리게 된다면,

이러한 형태이고  변수와 달리 배열은 저장공간이 연속적으로 배치되어 있다는 특징이 있음.

 

선언은 int[] num  이나 int num[]  둘다 가능하며 

new 연산자를 사용하여 선언한다.

 

생성된 배열의 저장공간을 배열의 요소 라고 하며, 인덱스로 각 요소에 접근한다. 인덱스는 요소마다 붙여진 일련번호이며 , 0부터 시작한다.

 

만약 인덱스가 벗어난 값을 사용한다면, ArrayIndexOutBoundsException 이 발생한다.

'java' 카테고리의 다른 글

List, map, Set  (0) 2023.06.16
데몬,우선순위,쓰레드 그룹  (0) 2023.06.15
싱글 쓰레드와 멀티 쓰레드  (0) 2023.06.15
프로세스와 쓰레드  (0) 2023.06.15
오류와 예외  (0) 2023.06.14

Validation은 입력된 데이터의 유효성을 검사하는 과정이다.

데이터의 유효성은 정해진 규칙에 따라 데이터가 올바른 형식과 값으로 구성되어 있는지 확인하는 것을 의미.

일반적으로 웹 애플리케이션에서 사용자로부터 받은 데이터를 검증하는 경우가 많습니다.

예를 들어, 회원 가입 시 입력한 이메일 주소가 올바른 형식인지, 비밀번호가 일정한 규칙에 맞는지, 입력 필드가 빈 값이 아닌지 등을 확인할 수 있습니다.

Validation은 잘못된 데이터가 시스템으로 들어오는 것을 방지하고, 데이터의 일관성과 신뢰성을 유지하기 위해 중요합니다.

잘못된 데이터가 시스템으로 들어오는 경우, 예기치 않은 동작이 발생하거나 시스템의 안정성이 저하될 수 있습니다.

따라서 입력된 데이터의 유효성을 검증하여 올바른 데이터만을 시스템으로 받아들이는 것이 중요합니다.(null 방지 포함.)

 

위는 Validation 에서 제공하는 어노테이션이다.

 

사용하는 방법은 값을 받으려는 객체에 @Valid 어노테이션을 달아주고

 

내부에선 아래와 같은 어노테이션을 달아 검증할수 있습니다.

 

만약 검증을 실패한다면? 

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
    // Validation 예외처리
    List<FieldError> fieldErrors = bindingResult.getFieldErrors();
    if(fieldErrors.size() > 0) {
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
        }
        return "redirect:/api/user/signup";
    }

    userService.signup(requestDto);

    return "redirect:/api/user/login-page";
}

위처럼 만약 회원가입에서 맞지않는 값으로 요청했을때 BindingResult 에 검증오류나 바인딩 오류가 쌓이게 된다.

오류가 존재한다면 해당 오류의 로그를 찍어내고 되돌려보낸다.

 

 

 

회원가입에서 @pattern 을 많이 이용할것같기 때문에 쓰이는 정규식에 대해 정리해보겠다.

 

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$

위는 이메일 주소의 패턴이다.  하나씩 설명하자면

^ : 문자열의 시작을 알림

[] : 대괄호 안에 문자들을 나열하여 일치하는 문자를 나타냄 . 따라서 [a-zA-Z0-9._%+-]는

          a-z 는 abcdefg,,, 가 들어갈 수 있고, A-Z와 0-9 도 마찬가지다.

          '._%+-' 이것도 다허락.   a-z, A-Z,0-9,'._%+-'  다 들어올수 있다는 소리.

+ : 문자가 1번은 나타야된다 라는 의미인데 +@ 라는 경우는 '@' 이것이 무조건 있어야한다는소리다

\\ : 정규식에서 특별한의미를 가지는 문자를 일반 문자로 바꿔준다. 위같은 경우(\\.)는 점을 일반 문자로 바꿔준것이다

 

{}: 정규식에서 반복 횟수를 지정하는데 사용되는 메타 문자이다. 중괄호 안에는 반복 횟수를 나타내는 숫자 또는 숫자 범위를 지정할 수 있다.

  • {n} 은 정확히 n 번 반복해야하며
  • {n,} 은 n번 이상 반복 가능하며,
  • {n,m} 최소 n 번에서 최대 m 번까지 반복가능하다는 소리이다.

위는 [a-zA-Z]에 들어가는 내용이 2번이상 반복가능하다는 소리이다.

 

'spring' 카테고리의 다른 글

Json Web Token 에 대해서  (0) 2023.07.01
쿠키와 세션  (0) 2023.06.30
DTO(Data Transfer Object)  (0) 2023.06.28

기존에 쓰던 세션 인증 방식은 서버에서 세션을 생성,저장하고 클라이언트에 세션id 를 전달했었다.

 

하지만 한번에 세션이 많이 생성된다면?

로그인을 한 회원수가 만명을 넘어간다면?

그럼 서버에서는 만명의 세션을 생성하고 저장해야하는데 그러면 저장공간을 많이 필요하게 된다.

만약 서버를 2개이상으로 돌린다면?

 

세션 정보를 찾기위해 DB 에 조회하는것부터 저장공간까지 많은 비용이 든다.

 

 

그래서 또 하나의 인증 방법으로 JWT 가 있다.

 

JWT란 ??

 

Json Web Token 이란 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token 이다.

 

JWT 는 세션과 다르게 DB 가 필요없다.

 

세션은 정보를 서버가 가지고 있는 반면에

JWT 는 정보를 클라이언트에 주는데 정보를 암호화 하여 넘긴다.(정확히는 시크릿키를 사용하여 페이로드와 서명을 조합한다.)

넘긴 정보를 토큰이라고 한다.

그럼 발급된 JWT 토큰을 가지고 인증이 필요한 서비스로 접속하면

서버가 토큰을 위조 여부 검증과 유효기간을 확인하여 검증한다.

 

서버가 2대 이상이라도 각자 똑같은 암호화와 복호화를 가지고 있다면 DB 와 통신할 일도 없다.

 

 

 

 

그럼 무조건 JWT 가 좋은거 아냐? 라고 생각할 수도 있지만,

일단 구현이 너무 어렵다. 세션 쓰고 싶은 마음이 커진다.

그리고 맘대로 토큰을 회수할수도 없다. 세션의 경우 DB 에서 삭제해서 접근을 막으면 되지만,

토큰의 경우 클라이언트가 가지고 있기 때문에 불가능하다.

 

요구상황에 따라서 알맞게 세션과 jwt 를 쓴다면 오는 이점이 많을것 같다.

'spring' 카테고리의 다른 글

Validation  (0) 2023.07.06
쿠키와 세션  (0) 2023.06.30
DTO(Data Transfer Object)  (0) 2023.06.28

그전에 보아야 할것은 인증과 인가 이다.

인증과 인가는 보안과 관련된 개념으로 애플리케이션에서 접근과 권한을 관리하는데 사용한다.

인증 Authentication

  • 사용자의 신분을 증명하는 것을 의미.
  • 대표적으로 아이디와 패스워드를 입력하여 로그인하는것이 인증.
  • 이러한 인증을 거치면 시스템또는 애플리케이션에 접근할 수 있는 권한을 가짐.

인가 Authorization

  • 인증된 사용자가 특정 자원이나 접근할 권한을 가지고 있는지 확인하는 과정.
  • 인증이 되면 특정한 권한, 역할, 규칙등을 부여하여 그 사용자의 접근을 제안하고 관리하는것을 의미.
  • 보안 정책을 구현하고 시스템 내의 자원을 보호하기 위해 사용.

 

우리가 사용하는 웹에서는 HTTP 통신을 하는데 특징으로는 요청과 응답이 독립적으로 처리되고, 

상태를 유지하지 않는다.

만약 인증이 필요한 사이트에 로그인을 했다고 하자. 

HTTP 통신 특성상 상태를 저장하지 않으니 로그인을 해도 누군지를 모른다.

 

그래서 쿠키와 세션이 필요하다.

쿠키

  • 쿠키는 서버에서 생성하여 클라이언트에게 전달하여 저장하게 하는 특성이 있다.
  • 쿠키 안에는 데이터를 넣을 수 있고, 관리는 클라이언트가 하며, 요청 때 자동으로 서버에 전송된다.
  • 쿠키에 만료시간을 설정할 수 있으며 만료 시간이 지나면 자동으로 삭제된다.

세션

  • 세션은 서버에 유지되는 사용자의 상태 정보이다.
  • 인증을 완료하면 세션 ID 가 생성되고 , 이를 클라이언트로 쿠키에 담아 전송된다.
  • 세션은 일정 시간 동안 유지되며, 클라이언트가 일정 시간 동안 요청을 보내지 않으면 만료될 수 있다.
  • 세션은 보안이 강화되어 있으며, 세션 데이터는 서버에 저장되기 때문에 클라이언트에 비해 안전.

 

 

 

 

 

이를 이용하여 쿠키에 저장된 세션을 통해 서버에서 상태를 체크할수 있다.

'spring' 카테고리의 다른 글

Validation  (0) 2023.07.06
Json Web Token 에 대해서  (0) 2023.07.01
DTO(Data Transfer Object)  (0) 2023.06.28

맨 처음 JPA 를 사용하긴 위해서 종속성을 받아야한다

그리고 jpa 를 쓰기위해서 여러가지 설정해주어야한다.

 

properties 설정

나는 이렇게 4개를 묶어서 쓴다.

첫번째부터 

  • spring.jpa.hibernate.ddl-auto = update : 이 옵션은 Hibernate의 DDL(Domain Definition Language) 자동 생성을 설정하는 것입니다. update 값은 애플리케이션 실행 시 데이터베이스 스키마를 확인하고 변경이 필요한 경우 자동으로 수정합니다. 이는 개발 단계에서 편리하게 데이터베이스 스키마를 유지하고 업데이트하는 데 사용될 수 있습니다.
  • spring.jpa.properties.hibernate.show_sql = true: 이 옵션을 사용하면 Hibernate가 실행하는 SQL 쿼리를 콘솔에 출력합니다. 이를 통해 개발자는 실행되는 쿼리를 실시간으로 확인하고 디버깅할 수 있습니다. 주의해야 할 점은, 프로덕션 환경에서는 이 옵션을 비활성화하는 것이 좋습니다.
  • spring.jpa.properties.hibernate.format_sql =t rue : 이 옵션은 Hibernate가 출력하는 SQL 쿼리를 읽기 쉬운 형식으로 포맷팅합니다. 쿼리를 보다 가독성 있게 표현해주어 개발 및 디버깅을 용이하게 합니다.
  • spring.jpa.properties.hibernate.use_sql_comments = true: 이 옵션은 Hibernate가 SQL 쿼리에 주석을 추가하도록 지정합니다. 주석을 통해 쿼리가 어떤 동작을 수행하는지나 어떤 부분에서 발생한 것인지 등의 추가 정보를 제공할 수 있습니다. 주석은 주로 디버깅이나 성능 튜닝 시에 유용하게 사용됩니다.

그럼 콘솔에 이와같이 쿼리를 보여주어 확인이 가능하다.

 

 

Repository 인터페이스 생성

repository 인터페이스를 생성하고 JpaRepository를 상속받는다.

 

 

수많은 기능들이 있으니 시간이 될때 한번씩 둘러보는것도 좋을것같다.

 

그다음 Repository 를 의존성 주입 받고 사용하면 된다.

 

findbyid 부터 findAll, 여러가지 기능이 있으니 찾아서 사용하면 될것같다.

 

참고로 레포지토리는 빈을 따로 등록을 안해도 자동으로 등록되는데 그이유는

@EnableJpaRepositories  덕분이다. JpaRepository를 상속받는 모든 repository 를 빈으로 등록시켜주어 따로 빈으로 등록안해도 자동으로 등록이된다.

 

 

 

 

 JPA 쿼리 작성법

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords

 

Spring Data JPA - Reference Documentation

Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

properties 설정 목록

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.data

 

Common Application Properties

 

docs.spring.io

 

'spring > JPA' 카테고리의 다른 글

JPA 란?  (0) 2023.06.29
영속성 컨텍스트와 트랜잭션  (0) 2023.06.27

java 개발자의 고민

초기 java 진영의 개발자들은 관계형 데이터베이스를 사용하기위해 JDBC API 를 써왔다.

JDBC API 와 SQL 를 쓰는데 많은 소요가 들었고 , 이를 보안하기 위해 아이바티스나 JDBC Template 를 사용하면서 코드를 줄일 수 있었다. 그렇지만 여전히 crud 는 반복해서 써야했고 이를 보안하기위해 나온것이 ORM 이다.

 

 

 

ORM(Object Relational Mapping) 은 객체와 관계형 데이터베이스 간의 차이를 중간에서 자동으로 연결해준다.

 

각 진영마다 ORM 이 존재하며 java 진영은 JPA 가 있다.

JPA 는 자바진영의 ORM 기술 표준이며, 이것을 도입하고 나서 SQL 직접 작성할 필요가 없어 시간이 많이 단축되고, 직접 작성해야한다해도 네이티브 SQL 을 이용해서 대처가 가능하다.

 

 

 

 

JPA 의 구현체로는 Hibernate, EclipseLink, OpenJPA 등 이 있으며,

JPA 인터페이스를 구현하고 ORM 기능을 제공한다.

 

JPA 를 사용한다면 개발자가 객체모델링과 테스트에 좀 더 집중할 시간이 늘어날 수 있기 때문에 적극 활용하는것이 좋다고 느낀다.

'spring > JPA' 카테고리의 다른 글

JPA 사용법  (0) 2023.06.29
영속성 컨텍스트와 트랜잭션  (0) 2023.06.27

IoC(제어의 역전) 컨테이너는 애플리케이션의 컴포넌트를 생성하고 관리하는 도구이며  IoC 컨테이너는 객체의 생성, 의존성 주입, 생명 주기 관리 등을 자동으로 처리한다.

 

 

특징

  • 객체 생성 및 관리: IoC 컨테이너는 애플리케이션에서 사용되는 객체를 생성하고 관리.
  • 의존성 주입(Dependency Injection): IoC 컨테이너는 객체 간의 의존성을 자동으로 주입. 
  • 설정 관리: IoC 컨테이너는 애플리케이션의 설정 정보를 관리합니다. 객체의 생성 방법, 의존성 정보, 프로퍼티 설정 등을 설정 파일 또는 어노테이션을 통해 관리하며, 이를 기반으로 객체를 생성하고 구성.
  • 생명 주기 관리: IoC 컨테이너는 객체의 생명 주기를 관리합니다. 객체의 생성, 초기화, 사용, 소멸 등의 단계를 제어하여 객체의 상태 변화에 따른 작업을 수행.

Bean

Bean은 빈은 IoC 컨테이너에 의해 생성, 관리되는 스프링 애플리케이션의 핵심 객체이며 빈은 일반적으로 스프링에서 관리되는 객체를 의미하며, ApplicationContext에 등록되어 IoC 컨테이너에 의해 생성, 초기화, 소멸 등의 생명 주기를 관리받습니다.

'spring > 개념' 카테고리의 다른 글

spring MVC 란 무엇일까?  (0) 2023.06.28
빌드란?  (0) 2023.06.23

데이터 전송을 위해 사용되는 객체이며 주로 비즈니스 로직을 포함하지 않고, 데이터의 전송과 변환을 위한 구조화된 객체로 사용됨.

 

목적

  • 데이터 전송 : DTO는 데이터의 전송을 단순화 하고 효율화하기 위해 사용.

      - 클라이언트 : 컨트롤러 사이의 객체 매핑

  • 데이터 변환 : DTO 는 서로 다른 계층 간에 데이터를 변환하는데 사용됨. 

      - DTO : Entity 변환

  • 보안 및 응답 제어 : DTO 는 클라이언트에 전달되는 데이터를 제어하고 보안을 강화하기 위해 사용될 수 있음.

     - 일부 필드 제외시키기

 

 

'spring' 카테고리의 다른 글

Validation  (0) 2023.07.06
Json Web Token 에 대해서  (0) 2023.07.01
쿠키와 세션  (0) 2023.06.30

+ Recent posts