-
[Spring Boot] 스프링 부트란? (어노테이션, 롬복, DAO-DTO, JPA, 쿼리 메서드 중심으로)네이버클라우드 캠프 | BE/Spring 2023. 6. 21. 10:50728x90
1. Spring Boot란?
Spring Boot는 개발자가 스프링 기반의 어플리케이션을 빠르고 쉽게 개발할 수 있도록 하는 프레임워크입니다.
Spring Boot는 아래와 같은 이유로 많은 개발자가 사용합니다.
1. 자동 설정: 어플리케이션 실행에 필요한 대부분의 기본 설정을 자동으로 해줍니다. (Spring Framework를 사용해 보신 분이라면..)
2. 내장 서버: Spring Boot는 웹 어플리케이션 서버(WAS)를 내장하고 있어 별도의 웹 서버 설치나 설정이 필요하지 않습니다.
3. 의존성 관리: Spring Boot Start를 통해 의존성 관리를 단순화하여, 호환 가능한 버전을 스스로 관리합니다.
4. 프로덕션 준비: 모니터링, 로깅, 보안과 같은 프로덕션 준비 기능을 내장해 개발자가 직접 구현하는 시간을 줄입니다.
Spring Boot 사용을 통해 개발자는 개발의 효율성을 높이고, 핵심 비즈니스 로직에 더욱 집중할 수 있습니다.
본문은 Spring Boot를 처음 접하며, 듣는 개념(정의)를 중심으로 구성하였습니다.
2. Annotation
Annotation(어노테이션, @)은 사전적으로 주석을 의미힙니다.
Annotation은 컴파일러에게 특정 정보를 제공하거나, 런타임에서 코드의 동작에 영향을 줄 수 있습니다.
이를 통해 코드를 간결하게 만들고, 중복을 줄이고, 개발자의 의도를 표현하는 데에 도움이 됩니다.
Annotation은 아래와 같은 용도로 사용됩니다.
1. 컴파일러 지시: 컴파일러에게 경고를 억제하거나, 오류를 검출하는데 도움 되는 정보를 제공합니다.
2. 코드 분석: Annotation을 통해 소프트웨어의 코드 구조 이해를 돕습니다.
Spring Boot에서 Annotation을 통해 수행할 수 있는 주요 작업은 아래 표와 같습니다.
Annotation 설명 @SpringBootApplication Spring Boot 어플리케이션의 시작점을 지정 @Configuration 클래스가 스프링 IoC 컨테이너를 위한 빈 정의의 소스임을 지정 @EnableAutoConfiguration Spring Boot 어플리케이션에 필요한 Bean 자동 설정 @ComponentScan 컴포넌트를 찾아 스프링 어플리케이션 컨텍스트에 등록하도록 지시 @RestController 클래스가 RESTful 서비스를 제공하는 컨트롤러임을 지정 @RequestMappoing @GetMapping @PostMapping HTTP 요청을 메서드에 매핑 @Autowired 스프링 IoC 컨테이너에 의한 자동 의존성 주입 지정 @Service @Component @Repository 클래스가 특정 레이어의 컴포넌트임을 지정 @Entity 클래스가 JPA Entity임을 지정 @Table @Column @Id JPA 매핑 정의 @Transactional 메서드/클래스에 걸쳐 트랜잭션의 범위 지정 3. GET, POST 요청 메서드
GET POST 용도 서버에서 정보 조회 시 서버에 데이터 제출 시
자원을 생성, 수정 시데이터 전송 데이터가 URL의 일부인 쿼리 문자열로 전송 데이터가 HTTP 메시지 본문의 일부로 전송 보안 노출 데이터로 민감한 정보 전송에 부적합 데이터가 노출되지 않아 민감 정보 전송에 적합 캐시 브라우저에 의해 캐시 가능
북마트나 기록으로 저장 가능자동으로 캐시되거나 저장되지 않음 요청에 따른 결과 동일한 요청에 대한 동일한 결과 동일한 요청에 대해 다른 결과 데이터 길이 데이터 길이에 제한 데이터 길이에 제한 없음 4. Lombok
Lombok(롬복)은 자바 개발을 단순화에 도움 주는 라이브러리로,
게터/세터, equals, hashCode, toString 메서드와 같은 반복적인 코드 작성을 줄일 수 있습니다.
Lombok에서 주로 사용하는 Annotation은 아래와 같습니다.
Annotation 설명 @Getter 게터 메서드 생성 @Setter 세터 메서드 생성 @ToString toString 메서드 생성 @EqualsAndHashCode equals, hashCode 메서드 생성 @NoArgsConstructor 파라미터 없는 기본 생성자 생성 @AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자 생성 @Data @Getter, @Setter, @ToString, @EqualsAndHashCode,
@RequiredArgsConstructor 모두 적용@Builder 빌더 패턴을 적용한 객체 생성 코드 생성 5. DAO와 DTO
DAO DTO 개념 데이터베이스에 대한 접근을 캡슐화하는 객체 계층간 데이터 교환을 위한 객체 특징 CRUD 작업을 메서드 형태로 제공, 변경에 유연 도메인 로직을 숨기고 필요한 데이터만 가지며,
데이터 전송을 위한 게터/세터 메서드를 포함사용하는 이유 데이터 접근 로직과 비즈니스 로직 분리,
코드의 재사용성 및 유지보수성 향상네트워크 통신 비용 최소화, 계층간 의존성 감소,
데이터 전달의 안정성6. JPA
JPA(Java Persisteence API)는 자바에서 제공하는 ORM(Object-Relational Mapping) 표준 스펙으로,
객체 지향 프로그래밍과 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는 프로그래밍 기법입니다.
즉, 객체를 데이터베이스의 테이블에 매핑시켜 주는 역할을 합니다.
JPA의 주요 특징은 아래와 같습니다.
1. 생산성 향상: SQL 쿼리를 직접 작성하지 않아도 데이터베이스 작업을 수행할 수 있어 개발 속도를 높일 수 있습니다.
2. 유지보수 용이성: SQL 쿼리 대신 자바로 DB 조작을 수행하여, 코드 수정이나 유지보수가 쉽습니다.
3. 데이터베이스 독립성: 특정 데이터베이스에 종속되지 않고, 동일한 코드로 조작할 수 있습니다.
6-1. JPA 동작 방식
Entity Manager Factory(엔티티 매니저 팩토리)
▼
Entity Manager(엔티티 매니저)
▼
Entity(엔티티)항목 설명 Entity Manager Factory 어플리케이션 전체에 하나만 생성되어 사용, 엔티티 매니저를 생성하는 역할 Entity Manager 개별 작업 단위마다 생성되어 사용, 엔티티의 CRUD 동작 수행하는 역할 Entity 데이터베이스 테이블을 자바 객체로 매핑, 하나의 테이블은 하나의 Entity Entity 매핑 관련 주요 Annotation은 아래와 같습니다.
Annotation 설명 @Entity 클래스를 엔티티로 선언, JPA의 관리 대상임을 지정 @Table 엔티티와 매핑할 테이블명 지정 @Id 엔티티의 기본 키 지정 @GeneratedValue 기본 키 생성 전략 지정 @Column 테이블의 컬럼에 매핑 @Lob 가변 길이의 큰 데이터 필드를 다루기 위한 어노테이션
*BLOB: 대용량 이진 데이터 저장
*CLOB: 대용량 문자 데이터 저장추가로 @Column과 관련된 속성은 아래와 같습니다.
name, unique, nullable, length, precision, scale, columnDefinition
6-2. 영속성 컨텍스트
영속성 컨텍스트는 객체 지향 프로그래밍과 관계형 데이터베이스의 패러다임 불일치 문제를 해결하기 위해 등장했습니다.
영속성 컨텍스트는 엔티티 인스턴스를 저장하고 관리하는 환경으로, 데이터베이스 사이의 모든 상호 작용을 처리합니다.
이를 통해 SQL 질의를 직접 작성하지 않고도 객체를 데이터베이스에 영구적으로 저장하고 검색할 수 있습니다.
아래와 같은 이유로 영속성 컨텍스트를 사용합니다.
항목 설명 1차 캐시와 동일성 보장 내부에 1차 캐시를 가지고 있어 조회 시 먼저 1차 캐시를 찾으며,
1차 캐시가 없다면 데이터베이스에서 찾아와 1차 캐시에 저장지연 로딩 연관된 엔티티가 실제로 사용될 때까지 로딩 지연 변경 감지 영속성 컨텍스트가 관리하는 엔티티의 상태를 지속적으로 확인하고,
변경 발생 시 데이터베이스에 자동 반영6-3. 쿼리 메서드
쿼리 메서드란 JPA에서 제공하는 특성 중 하나로, 메서드명만으로 데이터 쿼리 생성 및 실행할 수 있는 기능을 의미합니다.
쿼리 메서드를 통해 개발자는 복잡한 SQL 쿼리를 직접 작성할 필요가 없어, 코드가 간결해지고 개발 시간을 단축할 수 있습니다.
쿼리 메서드는 아래와 같은 특징을 가지고 있습니다.
1. 메서드 이름에 의해 정의되는 쿼리: findBy, countBy, deleteBy, readBy 키워드 이용
2. 복잡한 쿼리 생성을 위한 키워드 사용: And, Or, Is, Between, LessThan, GreaterThan, Like 사용 가능
3. 명확한 쿼리 의도 전달: 메서드 이름이 길어지더라도 쿼리의 의도를 명확히 전달
쿼리 메서드를 통해 아래와 같은 의도와 동작을 파악할 수 있습니다.
쿼리 메서드 동작 List<User> findByEmail(String email); 입력된 이메일과 일치하는 모든 User 엔티티 반환 User findByName(String name); 입력된 이름과 일치하는 User 엔티티 반환
(여러 개라면, 첫 번째 엔티티 반환)List<User> findByNameOrAge(String name, Integer age); 입력된 이름 또는 나이가 일치하는 모든 User 엔티티 반환 List<User> findByAgeGreaterThanEqual(int age); 입력된 나이 이상의 모든 User 엔티티 반환 List<User> findByCreatedDateAfter(Date date); 입력된 날짜 이후 생성된 모든 User 엔티티 반환 List<User> findByNameContaining(String name); 입력된 문자열이 이름에 포함된 모든 User 엔티티 반환 😀 마무리
오랜만에 블로그로 돌아와 Spring Boot의 핵심 개념들을 다루는 시간을 가졌습니다.
최근 KDT 해커톤에 참가하며 많은 인사이트를 얻게 되었는데요,
비록 아쉬운 결과지만 함께하는 동료들과 최선을 다했기에 후회 없이 해야 할 다른 일들과 공부에 집중하고 있습니다.
경험을 바탕으로 자기 계발과 함께 블로그 글도 꾸준히 업로드할 계획이니, 지켜봐 주세요.
감사합니다 :)
'네이버클라우드 캠프 | BE > Spring' 카테고리의 다른 글
[Spring Boot] 스프링 시큐리티 (0) 2023.06.26 [Spring Boot] JPQL과 Thymeleaf (0) 2023.06.22 [Spring Framework] 설치와 서버 생성 (환경설정 미포함) (0) 2023.05.26