BackEnd 87

Spring Webocket을 이용한 실시간 채팅 구현(+ JWT 인증)

GitHub - yangwoohyeon/OAuth2_9oormthonUNIVContribute to yangwoohyeon/OAuth2_9oormthonUNIV development by creating an account on GitHub.github.com WebSocket이란?서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술로써, sns, 화상 채팅, 증권 거래 등에서 널리 사용되고 있다. 왜 WebSocket을 사용하는가? HTTP를 사용하여 실시간 양방향 통신을 구현하기 위해서는 다음과 같은 방법을 사용할 수 있다. 백엔드에서 변경 사항이 생길 때마다 프론트엔드에게 응답을 보내주는 방식 : Server-Sent-Eve..

BackEnd/spring 2025.05.14

@Controller와 @RestController의 차이점

스프링 MVC에서 빠질 수 없는 애노테이션이 바로 @Controller이다. @Controller는 주로 HTML과 같은 뷰를 렌더링 할때 사용된다. @Controllerpublic class MyController { @RequestMapping("/greeting") public String greeting(Model model) { model.addAttribute("message", "Hello, World!"); return "greeting"; // greeting.jsp 또는 greeting.html과 같이 뷰를 찾아 렌더링 } }  하지만 뷰를 렌더링하는것 이 아닌 Data(또는 객체)를 반환해야 하는 경우도 존재한다. 이럴때는 @Respons..

BackEnd/spring 2025.02.23

스프링 트랜잭션 전파

스프링에서 트랜잭션을 사용중일때 추가로 트랜잭션을 수행하는 경우 어떻게 동작할지를 결정하는 것을 트랜잭션 전파(Propagation)이라고 한다. 트랜잭션  전파에 대한 개념을 알기 전에 외부 트랜잭션과 내부 트랜잭션에 대한 개념을 알아야 한다.  외부 트랜잭션이 수행중이고 아직 끝나지 않았는데 트랜잭션이 추가로 수행되면 이 트랜잭션을 내부 트랜잭션이라고 한다.내부 트랜잭션은 외부에 트랜잭션이 수행되고 있는 도중에 호출되기 때문에 마치 내부에 있는 것 처럼 보여 내부 트랜잭션이라 한다. 스프링에서는 외부 트랜잭션과 내부 트랜잭션을 아래 그림과 같이 하나의 트랜잭션으로 묶어서 만들어준다.   이러한 개념을 바탕으로 스프링은 논리 트랜잭션과 물리 트랜잭션이라는 개념을 사용한다.  이러한 개념을 도입했을때 지..

BackEnd/Database 2025.02.14

Spring 트랜잭션[@Transactional]

스프링에서 트랜잭션을 관리할 때 @Transactional이 거의 필수적으로 사용된다. 따라서 @Transactional에 대해 정확히 알고 사용하는 것이 매우 중요하다! @Transaction은 사용하면 핵심 비즈니스 로직과 공통기능 (로깅, 트랜잭션, 보안 등)을 분리하여 코드 재사용성과 유지보수성을 높이는 AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)를 활용하여 트랜잭션을 자동으로 관리해주는 선언적 트랜잭션 관리 방법이다. @Servicepublic class OrderService { private final EntityManager entityManager; public OrderService(EntityManager entityManager) {..

BackEnd/Database 2025.02.12

SpringBean

스프링 빈이란 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.  스프링 빈(Bean)의 필요성 스프링빈을 사용하는 이유는 크게 객체 관리의 효율성, 의존성 주입(DI), 객체의 생명주기 관리, 애플리케이션의 유지보수성 향상 때문이다. 1. 객체 생성을 자동으로 관리해준다. 스프링을 사용하지 않은 경우public class Main { public static void main(String[] args) { MyService myService = new MyService(); System.out.println(myService.getMessage()); }}..

BackEnd/spring 2025.02.11

QueryDSL

QueryDSL 이란 하이버네이트 쿼리 언어의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다. QueryDSL 장점기존의 MyBatis, JPQL 등의 문자열 형태로 쿼리문을 작성했을때는 쿼리문의 오류를 발견하는게 힘들지만 QueryDSL을 사용하면 자바 코드로 쿼리를 작성할 수 있어서 컴파일 오류를 통해 잘못된 쿼리가 실행되는 것을 방지할 수 있다.동적 쿼리를 매우 깔끔하게 사용할 수 있다.  QueryDSL 설정  스프링 부트 2.X 설정// Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManage..

BackEnd/Database 2025.02.10

Spring Data JPA

스프링 데이터 JPA란 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리 이다.스프링 JPA의 주요 특징인터페이스( JpaRepository )상속을 통한 기본적 CRUD 지원, 구현 클래스 자동 생성 Spring Data JPA에서 프록시 기술을 사용하여 구현 클래스를 자동으로 생성해주므로개발자는 인터페이스만 생성하고 의존성을 주입받아 편하게 사용하면 된다.  쿼리 메서드 기능 : 스프링 데이터 JPA가 메서드 이름을 분석하여 필요한 JPQL을 자동 생성해주어 복잡한 쿼리문을 생략할 수 있다.단,  아무 이름이나 사용하는 것은 안되고 규칙이 따로 존재한다.  조회: find…By, read…By, query…By, get…By예) findHelloBy처럼 …에 식별하기 위한 내용(설명)이 들어가도..

BackEnd/Database 2025.02.10

MyBatis

MyBatis는 Java에서 SQL을 보다 쉽게 다룰 수 있도록 도와주는 ORM 프레임워크이다. MyBatis는 기존의 JDBC보다 간편하게 데이터베이스와 연동할 수 있도록 SQL 매핑을 지원하며, XML 또는 애노테이션을 사용해 SQL을 작성할 수 있다. MyBatis의 장단점 장점동적 쿼리를 편리하게 작성할 수 있다.커넥션,트랜잭션과 관련된 기능을 MyBatis 스프링 연동 모듈이 자동으로 설정해준다.단점설정이 다소 복잡할 수 있다. MyBatis 사용  1. ItemMapper 생성 ItemMapper는 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스이다. SQL을 XML로 작성하면 @Mapper가 있는 인터페이스에 SQL을 자동으로 매핑시켜준다.package hello.itemservice.r..

BackEnd/Database 2025.02.08

DB Test[@Transactional, 임베디드 모드 DB]

테스트에서의 @Transactional 테스트를 할때 테스트 후 데이터가 다시 삭제 되어야 할때가 있다. 이럴때 사용할 수 있는게 @Transactional 이다. 원래 @Transactional은 로직이 정상 수행되면 커밋되어 데이터베이스에 변경사항을 저장하지만, 테스트에서 사용될 경우 모든 로직이 트랜잭션 안에서 수행되고 테스트가 끝나면 롤백을 수행하여 테스트에서 생성되거나 변경된 데이터를 롤백시킨다.  package hello.itemservice.domain;import java.util.List;import static org.assertj.core.api.Assertions.assertThat;@Transactional@SpringBootTestclass ItemRepositoryTest { ..

BackEnd/Database 2025.02.07

JdbcTemplate

실무에서 가장 간단하고 실용적인 방법으로 SQL을 사용하려면 JdbcTemplate를 사용하면 된다.  기본 사용법 단건 조회(queryForObject)int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor", Integer.class); 단건 조회 - 숫자 조회, 파라미터 바인딩 int countOfActorsNamedJoe = jdbcTemplate.queryForObject( "select count(*) from t_actor where first_name = ?", Integer.class, "Joe"); 단건 조회 - 문자 조회 String lastName = jdbcTemplate.queryForObject( "se..

BackEnd/Database 2025.02.07