Framework/SpringBoot
-
CI/CD란 무엇인지, SpringBoot 프로젝트를 Github Action을 이용하여 CI/CD를 하는 방법에 대해 작성한 글입니다. 🔔 준비 사항1. 배포할 SpringBoot 프로젝트2. (1) 프로젝트와 연동되어있는 Github Repository3. SpringBoot 프로젝트가 배포되어 있는 우분투 서버 ⚡️ 참고1. 스프링 버전 3.2.3을 사용하고 있습니다.2. Elastic Beanstalk 서버를 배포중입니다. CI/CD란? CI/CD는 지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)를 의미하며, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 하는 방법론 입니..
[SpringBoot] Github Action을 이용한 CI/CD (ElasticBeanstalk)CI/CD란 무엇인지, SpringBoot 프로젝트를 Github Action을 이용하여 CI/CD를 하는 방법에 대해 작성한 글입니다. 🔔 준비 사항1. 배포할 SpringBoot 프로젝트2. (1) 프로젝트와 연동되어있는 Github Repository3. SpringBoot 프로젝트가 배포되어 있는 우분투 서버 ⚡️ 참고1. 스프링 버전 3.2.3을 사용하고 있습니다.2. Elastic Beanstalk 서버를 배포중입니다. CI/CD란? CI/CD는 지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)를 의미하며, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 하는 방법론 입니..
15:51:55 -
VO, BO, DAO, DTO는 소프트웨어 개발에서 주로 사용되는 용어들입니다. 각각의 용어는 소프트웨어의 다른 층에서 사용되는 객체들을 나타냅니다. 각각의 역할과 특징에 대해 간단히 설명해보겠습니다. 요약 VO (Value Object): VO는 값을 담는 객체를 나타냅니다. 주로 데이터베이스의 테이블에 대응되는 엔티티의 상태를 나타냅니다. VO는 주로 불변(Immutable)하고, equals() 및 hashCode()와 같은 메서드를 오버라이드하여 객체의 동등성을 비교하는 데 사용됩니다. BO (Business Object): BO는 비즈니스 로직을 처리하는 객체를 나타냅니다. 주로 비즈니스 규칙을 구현하고, 데이터를 처리하며, 다양한 계산을 수행하는 데 사용됩니다. BO는 비즈니스 도메인에서의 객..
[Spring] VO와 BO, DAO, DTO란 무엇인가VO, BO, DAO, DTO는 소프트웨어 개발에서 주로 사용되는 용어들입니다. 각각의 용어는 소프트웨어의 다른 층에서 사용되는 객체들을 나타냅니다. 각각의 역할과 특징에 대해 간단히 설명해보겠습니다. 요약 VO (Value Object): VO는 값을 담는 객체를 나타냅니다. 주로 데이터베이스의 테이블에 대응되는 엔티티의 상태를 나타냅니다. VO는 주로 불변(Immutable)하고, equals() 및 hashCode()와 같은 메서드를 오버라이드하여 객체의 동등성을 비교하는 데 사용됩니다. BO (Business Object): BO는 비즈니스 로직을 처리하는 객체를 나타냅니다. 주로 비즈니스 규칙을 구현하고, 데이터를 처리하며, 다양한 계산을 수행하는 데 사용됩니다. BO는 비즈니스 도메인에서의 객..
2024.03.24 -
Swagger가 무엇인지, 스프링부트 애플리케이션과 Swagger의 연결 방법에 대해 작성한 글입니다. Swagger란? Swagger는 API 개발 및 문서화를 위한 도구입니다. Swagger를 사용하면 자동으로 API를 문서화할 수 있습니다. 다음 기능들을 통해서 API를 문서화하고 관리할 수 있습니다. API 문서 자동 생성: Swagger를 사용하면 개발자가 작성한 API 코드를 기반으로 자동으로 API 문서를 생성할 수 있습니다. 이를 통해 API의 엔드포인트, 매개변수, 응답 형식 등에 대한 세부 정보를 쉽게 확인할 수 있습니다. API 스펙 정의: Swagger는 OpenAPI Specification(OAS)을 사용하여 API 스펙을 정의합니다. 이를 통해 API의 구조와 동작 방식에 대한..
[SpringBoot3] 스프링부트와 Swagger 연결방법Swagger가 무엇인지, 스프링부트 애플리케이션과 Swagger의 연결 방법에 대해 작성한 글입니다. Swagger란? Swagger는 API 개발 및 문서화를 위한 도구입니다. Swagger를 사용하면 자동으로 API를 문서화할 수 있습니다. 다음 기능들을 통해서 API를 문서화하고 관리할 수 있습니다. API 문서 자동 생성: Swagger를 사용하면 개발자가 작성한 API 코드를 기반으로 자동으로 API 문서를 생성할 수 있습니다. 이를 통해 API의 엔드포인트, 매개변수, 응답 형식 등에 대한 세부 정보를 쉽게 확인할 수 있습니다. API 스펙 정의: Swagger는 OpenAPI Specification(OAS)을 사용하여 API 스펙을 정의합니다. 이를 통해 API의 구조와 동작 방식에 대한..
2024.03.21 -
상속관계에서 Builder를 적용했을 때 발생한 이슈에 대해 작성한 글입니다. 발생 배경 엔티티에 @Builder 어노테이션을 사용하였습니다. @Entity @DiscriminatorValue("PRODUCT") @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Product extends Item { @Enumerated(EnumType.STRING) @Column(nullable = false) private ProductStatus status; // ... } 다만 Product의 부모 엔티티인 Item에도 @Builder 어노테이션이 있는데요 @Entity @Inhe..
[SpringBoot3] 엔티티 상속관계에서 @Builder 적용상속관계에서 Builder를 적용했을 때 발생한 이슈에 대해 작성한 글입니다. 발생 배경 엔티티에 @Builder 어노테이션을 사용하였습니다. @Entity @DiscriminatorValue("PRODUCT") @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Product extends Item { @Enumerated(EnumType.STRING) @Column(nullable = false) private ProductStatus status; // ... } 다만 Product의 부모 엔티티인 Item에도 @Builder 어노테이션이 있는데요 @Entity @Inhe..
2024.03.20 -
application.properties의 정보들을 분리하여 관리하는 방법에 대해 설명한 글입니다. application.properties란 spring.jpa.defer-datasource-initialization=true spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=create application.properties는 자바 기반의 애플리케이션에서 주로 사용되는 설정 파일..
[SpringBoot] application.properties에서 DB 정보 등 민감한 내용 분리하기application.properties의 정보들을 분리하여 관리하는 방법에 대해 설명한 글입니다. application.properties란 spring.jpa.defer-datasource-initialization=true spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=create application.properties는 자바 기반의 애플리케이션에서 주로 사용되는 설정 파일..
2024.03.13 -
MappedSuperclass에 대해 정리한 글입니다. @MappedSuperclass란 @MappedSuperclass는 JPA에서 엔티티 클래스들 간에 공통된 매핑 정보를 재사용하기 위한 어노테이션입니다. 이 어노테이션을 사용하면 여러 엔티티 클래스에서 동일한 매핑 정보를 공유하여 코드의 중복을 줄여줍니다. 가령 createdAt, updatedAt 등 모든 엔티티에 공통적으로 포함되는 필드가 있다면 @MappedSuperclass를 이용하여 공통된 필드를 포함하는 클래스를 다른 엔티티들이 상속받도록 하면 됩니다. @MappedSuperclass 사용 아래 BaseEntity가 @MappedSuperclass로 지정되어있습니다. import lombok.AccessLevel; import lombok..
[Spring] MappedSuperclass 사용하기MappedSuperclass에 대해 정리한 글입니다. @MappedSuperclass란 @MappedSuperclass는 JPA에서 엔티티 클래스들 간에 공통된 매핑 정보를 재사용하기 위한 어노테이션입니다. 이 어노테이션을 사용하면 여러 엔티티 클래스에서 동일한 매핑 정보를 공유하여 코드의 중복을 줄여줍니다. 가령 createdAt, updatedAt 등 모든 엔티티에 공통적으로 포함되는 필드가 있다면 @MappedSuperclass를 이용하여 공통된 필드를 포함하는 클래스를 다른 엔티티들이 상속받도록 하면 됩니다. @MappedSuperclass 사용 아래 BaseEntity가 @MappedSuperclass로 지정되어있습니다. import lombok.AccessLevel; import lombok..
2024.02.14 -
spring.jpa.hibernate.ddl-auto에 대한 글입니다. application.properties 에서 데이터베이스 관련 속성으로 spring.jpa.hibernate.ddl-auto를 많이 보셨을겁니다. 이 글에서는 이 속성과 주요 값들에 대해 알아보겠습니다. spring.jpa.hibernate.ddl-auto spring.jpa.hibernate.ddl-auto는 스프링 부트 애플리케이션에서 하이버네이트(Hibernate)를 사용할 때, 데이터베이스 스키마를 자동으로 생성, 수정 또는 유지하도록 할 수 있는 속성입니다. 이 속성을 설정함으로써 Hibernate가 데이터베이스 스키마를 자동으로 처리할 수 있습니다. create create는 애플리케이션 실행 시에 스키마를 새로 생성합니..
[SpringBoot] 데이터베이스 스키마 자동 생성 옵션에 대해 알아보자 / spring.jpa.hibernate.ddl-autospring.jpa.hibernate.ddl-auto에 대한 글입니다. application.properties 에서 데이터베이스 관련 속성으로 spring.jpa.hibernate.ddl-auto를 많이 보셨을겁니다. 이 글에서는 이 속성과 주요 값들에 대해 알아보겠습니다. spring.jpa.hibernate.ddl-auto spring.jpa.hibernate.ddl-auto는 스프링 부트 애플리케이션에서 하이버네이트(Hibernate)를 사용할 때, 데이터베이스 스키마를 자동으로 생성, 수정 또는 유지하도록 할 수 있는 속성입니다. 이 속성을 설정함으로써 Hibernate가 데이터베이스 스키마를 자동으로 처리할 수 있습니다. create create는 애플리케이션 실행 시에 스키마를 새로 생성합니..
2023.12.26 -
엔티티가 만들어 질 때 현재 날짜를 디폴트 값으로 하는 방법에 대해 작성한 글입니다. 가령 게시글에 관한 테이블이라고 하면 created_at처럼 데이터가 추가되는 시점의 날짜를 저장하는 필드가 있을 것입니다. MySQL에서는 insert 쿼리에서 now() 함수를 쓰거나, 디폴트 값을 주면되는 아주 간단한 문제지만, 스프링에서는 어떻게 검색해야할 지도 잘 모르겠고(본인 얘기1), 내 논리라면 이게 되야 하는데...? 라고 생각하지만 잘 안되는 문제라서(본인 얘기2) 글로 정리하게 되었습니다. 부디 저만 삽질한 것이 아니길... 😈 "Spring Data JPA automatic date creation" 이라고 검색하면 스택 오버 플로우에 답변이 몇 개 있긴 하더라고요... 글은 문제를 해결하는 과정순..
[SpringBoot] created_at 처럼 엔티티 생성할 때 현재 날짜를 디폴트 값으로 지정하기 + 수정일 / Spring Data JPA automatic date creation엔티티가 만들어 질 때 현재 날짜를 디폴트 값으로 하는 방법에 대해 작성한 글입니다. 가령 게시글에 관한 테이블이라고 하면 created_at처럼 데이터가 추가되는 시점의 날짜를 저장하는 필드가 있을 것입니다. MySQL에서는 insert 쿼리에서 now() 함수를 쓰거나, 디폴트 값을 주면되는 아주 간단한 문제지만, 스프링에서는 어떻게 검색해야할 지도 잘 모르겠고(본인 얘기1), 내 논리라면 이게 되야 하는데...? 라고 생각하지만 잘 안되는 문제라서(본인 얘기2) 글로 정리하게 되었습니다. 부디 저만 삽질한 것이 아니길... 😈 "Spring Data JPA automatic date creation" 이라고 검색하면 스택 오버 플로우에 답변이 몇 개 있긴 하더라고요... 글은 문제를 해결하는 과정순..
2023.12.24 -
문제 상황 main/resources/data.sql 에 insert 쿼리를 작성하였는데, api를 테스트해보니 data.sql에 있는 쿼리가 적용되지 않았습니다. data.sql INSERT INTO users (name, id, password, ...) VALUES (...); INSERT INTO users (name, id, password, ...) VALUES (...); -- 이하 생략 -- application.properties spring.jpa.defer-datasource-initialization=true spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://lo..
[SpringBoot] 스프링 부트 data.sql이 실행되지 않을 때 (data.sql not working)문제 상황 main/resources/data.sql 에 insert 쿼리를 작성하였는데, api를 테스트해보니 data.sql에 있는 쿼리가 적용되지 않았습니다. data.sql INSERT INTO users (name, id, password, ...) VALUES (...); INSERT INTO users (name, id, password, ...) VALUES (...); -- 이하 생략 -- application.properties spring.jpa.defer-datasource-initialization=true spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://lo..
2023.12.24 -
RestTemplate RestTemplate는 스프링 프레임워크가 제공하는 클래스로, RESTful 웹 서비스와 상호작용 하는 과정을 단순화하여 편리하게 API를 호출할 수 있습니다. RestTemplate의 동작 원리 어플리케이션이 RestTemplate를 생성합니다. (URI, HTTP 메서드 등 헤더를 담아서 요청함) RestTemplaterk HttpMessageConverter를 사용하여 requestEntity를 요청 메세지로 변환합니다. RestTemplate가 ClientHttpRequestFactory로 부터 ClientHttpRequest를 가져와서 요청을 보냅니다. ClientHttpRequest는 요청 메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신합니다. RestTempla..
[Spring] Rest Template란?RestTemplate RestTemplate는 스프링 프레임워크가 제공하는 클래스로, RESTful 웹 서비스와 상호작용 하는 과정을 단순화하여 편리하게 API를 호출할 수 있습니다. RestTemplate의 동작 원리 어플리케이션이 RestTemplate를 생성합니다. (URI, HTTP 메서드 등 헤더를 담아서 요청함) RestTemplaterk HttpMessageConverter를 사용하여 requestEntity를 요청 메세지로 변환합니다. RestTemplate가 ClientHttpRequestFactory로 부터 ClientHttpRequest를 가져와서 요청을 보냅니다. ClientHttpRequest는 요청 메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신합니다. RestTempla..
2023.09.09 -
OAuth 앱 등록하기 깃허브에서 Setting > Developer Setting > OAuth Apps > Register a new application 으로 이동하여 OAuth 로그인을 할 앱을 등록해줍니다. 저는 현재 서버를 배포하지 않고 로컬에서 작업하고 있기 때문에 Hompage URL은 http://localhost:8080으로 해줬습니다. Authorization callback URL에는 로그인 후 돌아갈 즉 redirect url을 입력해주세요 토큰 생성하기 Register application을 누르고 바로 다음 화면에서 Generate a new client secret을 클릭하면 토큰이 발급됩니다. 발급받은 토큰은 Spring에서 사용되니 어딘가에 복사 해놓으세요 Spring 설..
[Spring] Spring에서 깃허브 OAuth 로그인하기OAuth 앱 등록하기 깃허브에서 Setting > Developer Setting > OAuth Apps > Register a new application 으로 이동하여 OAuth 로그인을 할 앱을 등록해줍니다. 저는 현재 서버를 배포하지 않고 로컬에서 작업하고 있기 때문에 Hompage URL은 http://localhost:8080으로 해줬습니다. Authorization callback URL에는 로그인 후 돌아갈 즉 redirect url을 입력해주세요 토큰 생성하기 Register application을 누르고 바로 다음 화면에서 Generate a new client secret을 클릭하면 토큰이 발급됩니다. 발급받은 토큰은 Spring에서 사용되니 어딘가에 복사 해놓으세요 Spring 설..
2023.09.01 -
@OneToMany @OneToMany 어노테이션은 하나의 엔티티와 다른 엔티티간의 일대다 관계를 매핑하는데 사용됩니다. 일대다 관계에서는 하나의 인스턴스가 다른 엔티티의 여러 인스턴스와 연결됩니다. @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "department", cascade = CascadeType.ALL) private List employees = new ArrayList(); } @Entity public class Employee { @Id @GeneratedValue..
[SpringBoot] @OneToMany, @ManyToOne, @ManyToMany 연관 관계 매핑, @JoinTable@OneToMany @OneToMany 어노테이션은 하나의 엔티티와 다른 엔티티간의 일대다 관계를 매핑하는데 사용됩니다. 일대다 관계에서는 하나의 인스턴스가 다른 엔티티의 여러 인스턴스와 연결됩니다. @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "department", cascade = CascadeType.ALL) private List employees = new ArrayList(); } @Entity public class Employee { @Id @GeneratedValue..
2023.08.30 -
스프링 시큐리티란? Spring Security는 자바 기반 웹 애플리케이션을 위한 보안 서비스를 제공합니다. Spring의 보안을 위한 표준 라이브러리로 사용됩니다. 스프링 시큐리티가 제공하는 기능은 다음과 같습니다. 인메모리 사용자 하나를 포함하는 AuthenticationManager 빈 사용자 이름은 user이고 암호는 콘솔에 출력됩니다 /css 나 /image 같은 공용 정적 리소스 위치를 위해 무시되는 경로, 다른 모든 엔드포인트에 대한 HTTP 기본 인증 스프링의 ApplicationEventPublisher 인터페이스로 게시되는 스프링 이벤트 자동 생성되는 기본 로그인 페이지 사용 예시 @Configuration @EnableWebSecurity public class SecurityCon..
[SpringBoot]스프링 시큐리티란? (Spring Security)스프링 시큐리티란? Spring Security는 자바 기반 웹 애플리케이션을 위한 보안 서비스를 제공합니다. Spring의 보안을 위한 표준 라이브러리로 사용됩니다. 스프링 시큐리티가 제공하는 기능은 다음과 같습니다. 인메모리 사용자 하나를 포함하는 AuthenticationManager 빈 사용자 이름은 user이고 암호는 콘솔에 출력됩니다 /css 나 /image 같은 공용 정적 리소스 위치를 위해 무시되는 경로, 다른 모든 엔드포인트에 대한 HTTP 기본 인증 스프링의 ApplicationEventPublisher 인터페이스로 게시되는 스프링 이벤트 자동 생성되는 기본 로그인 페이지 사용 예시 @Configuration @EnableWebSecurity public class SecurityCon..
2023.08.23 -
에러 메세지 Caused by: org.hibernate.AnnotationException: Association 'org.coteis.domain.article.Article.algorithmNo' targets an unknown entity named 'java.lang.Integer' 발생 배경 @ManyToOne @JoinColumn(name = "algorithm_no") private Integer algorithmNo; @ManyToOne @JoinColumn(name = "difficulty_no") private Integer difficultyNo; @ManyToOne @JoinColumn(name = "language_no") private Integer languageNo; @M..
[SpringBoot] AnnotationException: targets an unknown entity named : 조인 맵핑 시 데이터 타입이 다를 경우 발생하는 에러에러 메세지 Caused by: org.hibernate.AnnotationException: Association 'org.coteis.domain.article.Article.algorithmNo' targets an unknown entity named 'java.lang.Integer' 발생 배경 @ManyToOne @JoinColumn(name = "algorithm_no") private Integer algorithmNo; @ManyToOne @JoinColumn(name = "difficulty_no") private Integer difficultyNo; @ManyToOne @JoinColumn(name = "language_no") private Integer languageNo; @M..
2023.06.25 -
발생 배경 resource 의 data.sql 파일에 값을 넣고 실행하니 CommandAcceptanceException 이 발생하였다 중략 맨 마지막 SQLSyntaxErrorException을 보고 문법이 잘못되었나 싶었는데 그건 아니었다. 원인 파악 CommandAcceptanceException에 대해 검색해보니 원인은 다양했다 하이버네이트가 table을 만들 때 drop하지 못해서 계정의 권한으로는 할 수 없는 쿼리를 작성해서 SQL이나 H2의 예약어를 사용하여 Entity를 작성해서 나는 1번 사항에는 해당하지 않았다 하이버네이트가 table을 drop 하는 것은 확인되었기 때문이다. 2번 사항도 user 테이블 말고 다른 table에 insert하는 데에는 오류가 발생하지 않았기 때문에 해당..
[SpringBoot] CommandAcceptanceException : table명이 예약어일 때 발생하는 Exception발생 배경 resource 의 data.sql 파일에 값을 넣고 실행하니 CommandAcceptanceException 이 발생하였다 중략 맨 마지막 SQLSyntaxErrorException을 보고 문법이 잘못되었나 싶었는데 그건 아니었다. 원인 파악 CommandAcceptanceException에 대해 검색해보니 원인은 다양했다 하이버네이트가 table을 만들 때 drop하지 못해서 계정의 권한으로는 할 수 없는 쿼리를 작성해서 SQL이나 H2의 예약어를 사용하여 Entity를 작성해서 나는 1번 사항에는 해당하지 않았다 하이버네이트가 table을 drop 하는 것은 확인되었기 때문이다. 2번 사항도 user 테이블 말고 다른 table에 insert하는 데에는 오류가 발생하지 않았기 때문에 해당..
2023.06.10