목록spring boot (12)
채채
compileClasspath과 runtimeClasspath의 차이점을 알아보자. 먼저 둘의 이름을 보면 대략 compileClasspath는 compile할 때 필요한 class들의 path이고, runtimeClasspath는 runtime에 필요한 class들의 path인가? 라는 생각이 들었다. 그러나 classpath가 무엇인지 개념적인 설명을 깊이 할 수 없었다. 1. classPath란? 우리가 java로 코드를 작성한 .java파일(소스 코드)을 compile하면 .class파일(바이트 코드의 실행 파일)이 생성된다. 만약 우리가 program.java파일의 소스코드 맨 윗단에 외부 패키지를 import했다고 하자. 그럼 자바 컴파일러는 해당 패키지를 찾으려고 import한 경로를 따라 ..
1. DAO(Data Access Object) public class UserDao { private Connection connection; public void saveUser(User user) { String query = "INSERT INTO users (username, email) VALUES (?, ?)"; try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { preparedStatement.setString(1, user.getUsername()); preparedStatement.setString(2, user.getEmail()); preparedStatement.executeUpdate()..
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //... } Entity를 생성할 때 Id의 자료형은 왜 int나 long이 아니라 Long일까? 1. int에 비해 long은 숫자 범위가 넓다. Id값은 주로 사용자를 식별할 때 쓰이므로 전 세계 인구로 예를 들어보자. 2024년 1월 6일을 기준으로 현재 세계 인구는 80억명이 넘는다. int형은 전세계 사람들의 정보를 담지 못하지만, long형은 담을 수 있다. 2. nullable int와 long과 같은 기본 타입(primitive type)은 기본값이 0이다. 만약 id가 nullable하고, id값이 입력되..
자바로 백엔드를 개발할 때 주로 Spring Boot와 Spring Data JPA를 같이 사용한다. 그러나 JPA를 사용하다보면 N+1문제를 직면하기도 하며, 이를 해결하기 위해 다양한 조인 조건과 Fetch Join 등의 복잡한 쿼리를 작성할 때 JPA로 작성하기엔 메소드명이 길어짐에 따라 가독성이 떨어지게 된다. 또한 동적쿼리를 작성하는 것에 있어서 JPA는 제약이 존재한다. public interface MyEntityRepository extends JpaRepository { // age가 주어진 값보다 크고, city가 주어진 문자열을 포함하며, name이 주어진 접두사로 시작하는 엔터티들을 찾는다. List findByAgeGreaterThanAndCityContainingAndNameSt..
8.2 회원 도메인 만들기 스프링 시큐리티를 사용해 인증, 인가 기능을 구현하는 것이 목적 1. 회원 정보를 저장할 테이블을 만든다. 2. 테이블과 연결할 도메인을 만든다. 3. 테이블과 연결할 회원 엔티티를 만든다. 4. 데이터를 조회해줄 리포지터리를 만든다. 5. 스프링 시큐리티에서 사용자 정보를 가져온다. // build.gradle에 스프링 시큐리티 의존성 추가 dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' testImplementation 'org.springfra..
1. 테스트 코드 개념 익히기 테스트 코드는 test 디렉터리에서 작업한다. 테스트 코드 패턴 중 given-when-then 패턴이란? given: 테스트 실행을 준비하는 단계 / when: 테스트를 진행하는 단계 / then: 테스트 결과를 검증하는 단계 // 새로운 메뉴를 저장하는 코드 테스트 @DisplayName("새로운 메뉴를 저장한다.") @Test public void saveMenuTest() { // given : 메뉴를 저장하기 위한 준비 과정 final String name = "아메리카노"; final int price = 2000; final Menu americano = new Menu(name, price); // when : 실제로 메뉴를 저장 final long saved..
1. 스프링 부트 3 프로젝트 만들기 IntelliJ를 이용해서 JDK 17의 새 그레이들 프로젝트를 생성한다. 그레이들 프로젝트를 스프링 부트 3 프로젝트로 바꾸기 위해 build.gradle을 다음과 같이 플러그인과 의존성들을 입력한다. plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' } group 'org.example' version '1.0' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframewor..
SpringBoot는 목적에 따라 패키지를 따로 생성해서 프로젝트를 관리하는데, 패키지의 구조는 2가지로 나뉜다. 1️⃣계층형 패키지 구조 - 계층형으로 패키지를 설계하는 방식 - 장: 전체적인 구조를 빠르게 파악 - 단: 디렉토리에 클래스들이 많이 모임 2️⃣도메인 패키지 구조 - 도메인 단위로 디렉토리 구성 - 장: 관련된 코드들이 응집됨 - 단: 프로젝트에 대한 이해도가 낮을 경우, 전체적인 구조를 파악하기 어려움 따라서, 복잡도가 낮고 제공하는 기능이 적어 하나의 계층에 속하는 클래스 수가 적을 때. 제공하는 기능을 명확한 기준으로 분리하기가 애매할 때. 추후에 모듈별로 분리하게 될 일이 없을 것 같은, 작은 규모의 프로젝트 ➡️ 계층형 패키지 구조 복잡도가 높고 제공하는 기능이 많아 하나의 계층..
스프링 시큐리티 : 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크 -> 인터셉터, 필터 기반의 보안 기능을 구현하기보다 확장성을 위해 스프링 시큐리티를 통해 구현하는 것을 권장. CommonOAuth2Provider: 스프링부트 2.0방식으로 넘어오며 기본 설정값을 enum(열거형)으로 저장함 -> 구글, 페이스북, 옥타, 깃허브만 해당. 네이터, 카카오 등 다른 소셜 로그인을 추가한다면 직접 추가해야함. 1️⃣ 구글 로그인 연동하기 📜사용자 정보 담당 도메인 - User User class - 사용자 정보 담당 // 생략 @Getter @NoArgsConstructor @Entity public class User extends BaseTimeEntity ..
API를 만들기 위해선 3가지 클래스가 필요하다. Dto: request 데이터 수신 Controller: API 요청 수신 Service: 트랜잭션, 도메인 기능 간 순서 보장 Service에서는 비즈니스 로직(규칙에따라 데이터를 생성, 표시, 저장, 변경)을 처리하지 않는다. 그러면 비즈니스 로직은 누가 처리할까? ➡️ Spring 웹 계층 1. Web Layer 뷰 템플릿 영역 ex) 컨트롤러(@Controller), JSP/Freemarker 등 외부 요청과 응답 ex) 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 2. Service Layer @Service, @Transactional이 사용되는 영역 Controller와 Dao의 중간 영역 3. ..