
코딩애플 강의를 통해 배운 Spring Boot & JPA를 정리한 글입니다.
2025년 3월 11일
Part 3 : Part 3
// Controller
@GetMapping("/user/1")
@ResponseBody
Member getUser() {
var a = memberRepository.findById(1L);
var result = a.get();
var data = new MemberDto(result.getUsername(), result.getDisplayName());
return result;
}
// DTO
class MemberDto {
public String username;
public String displayName;
public MemberDto(String a, String b) {
this.username = a;
this.displayName = b;
}
}
// Repository
package com.example.shop.item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ItemRepository extends JpaRepository<Item, Long> {
Page<Item> findPageBy(Pageable page);
}
// Controller
@GetMapping("/list/page/{page}")
String getListPage(Model model, @PathVariable Integer page) {
Page<Item> result = itemRepository.findPageBy(PageRequest.of(page-1,5));
model.addAttribute("items", result);
return "list.html";
}
// Repository.interface
package com.example.shop.item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ItemRepository extends JpaRepository<Item, Long> {
Page<Item> findPageBy(Pageable page);
List<Item> findAllByTitleContains(String title);
}
// Item.java
package com.example.shop.item;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Entity
@ToString
@Setter
@Getter
@Table(indexes = @Index(columnList = "title", name = "작명"))
public class Item {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@Column(nullable = false)
private String title;
private Integer price;
}
// Controller.java
@PostMapping("/search")
String postSearch(@RequestParam String searchText) {
var result = itemRepository.findAllByTitleContains(searchText);
System.out.println(result);
return "redirect:/list";
}
-- 인덱스생성
CREATE FULLTEXT INDEX title_search
ON shop.item(title) WITH PARSER ngram;
// Controller
@PostMapping("/search")
String postSearch(@RequestParam String searchText) {
var result = itemRepository.rawQuery1(searchText);
System.out.println(result);
return "redirect:/list";
}
// Repository.js
package com.example.shop.item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface ItemRepository extends JpaRepository<Item, Long> {
Page<Item> findPageBy(Pageable page);
List<Item> findAllByTitleContains(String title);
@Query(value = "select * from shop.item where match(title) against(?1)", nativeQuery = true)
List<Item> rawQuery1(String text);
}
// Entity - 시간 알아서 채워줌
@CreationTimestamp
LocalDateTime created;
// Entity - 시간 알아서 채워줌
@CreationTimestamp
LocalDateTime created;
// Entity - 해당 컬럼과 연결된 테이블들을 가져온다
@ManyToOne
@JoinColumn(name="member_id", foreignKey = @ForeignKey())
private Member memberId;
@Query(value = "SELECT s FROM Sales s JOIN FETCH s.member")
List<Sales> customFindAll();
// 항상 가져옴
@ManyToOne(fetch = FetchType.EAGER)
// 필요할떄만 가져옴
@ManyToOne(fetch = FetchType.LAZY)
@OneToMany(mappedBy = "member")
List<Sales> sales = new ArrayList<>();
// build
implementation 'io.jsonwebtoken:jjwt-api:0.12.5'
implementation 'io.jsonwebtoken:jjwt-gson:0.12.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.5'
// Controller
private final AuthenticationManagerBuilder authenticationManagerBuilder;
@PostMapping("/login/jwt")
@ResponseBody
String loginJWT(@RequestBody Map<String, String> data) {
var authToken = new UsernamePasswordAuthenticationToken(data.get("username"), data.get("password"));
var auth = authenticationManagerBuilder.getObject().authenticate(authToken);
SecurityContextHolder.getContext().setAuthentication(auth);
return "redirect:/list";
}
// Util
package com.example.shop.member;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
@Component
public class JwtUtil {
static final SecretKey key =
Keys.hmacShaKeyFor(Decoders.BASE64.decode(
"jwtpassword123jwtpassword123jwtpassword123jwtpassword123jwtpassword"
));
// JWT 만들어주는 함수
public static String createToken() {
String jwt = Jwts.builder()
.claim("username", "어쩌구")
.claim("displayName", "저쩌구")
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + 10000)) //유효기간 10초
.signWith(key)
.compact();
return jwt;
}
// JWT 까주는 함수
public static Claims extractToken(String token) {
Claims claims = Jwts.parser().verifyWith(key).build()
.parseSignedClaims(token).getPayload();
return claims;
}
}
<form>
<input name="username" id="username" />
<input name="password" id="password" type="password" />
</form>
<button onclick="loginJWT()">전송</button>
<script>
function loginJWT() {
fetch("/login/jwt", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
username: document.querySelector("#username").value,
password: document.querySelector("#password").value,
}),
})
.then((r) => r.text())
.then((r) => {
console.log(r);
});
}
</script>
package com.example.shop.member;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import org.springframework.security.core.Authentication;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.stream.Collectors;
@Component
public class JwtUtil {
static final SecretKey key =
Keys.hmacShaKeyFor(Decoders.BASE64.decode(
"jwtpassword123jwtpassword123jwtpassword123jwtpassword123jwtpassword"
));
// JWT 만들어주는 함수
public static String createToken(Authentication auth) {
var user = (CustomUser) auth.getPrincipal();
var authorities =auth.getAuthorities().stream().map(a-> a.getAuthority()).collect(Collectors.joining(","));
String jwt = Jwts.builder()
.claim("username", user.getUsername())
.claim("displayName", user.displayName)
.claim("authorities", authorities)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + 10000)) //유효기간 10초
.signWith(key)
.compact();
return jwt;
}
// JWT 까주는 함수
public static Claims extractToken(String token) {
Claims claims = Jwts.parser().verifyWith(key).build()
.parseSignedClaims(token).getPayload();
return claims;
}
}
@PostMapping("/login/jwt")
@ResponseBody
String loginJWT(@RequestBody Map<String, String> data, HttpServletResponse response) {
var authToken = new UsernamePasswordAuthenticationToken(data.get("username"), data.get("password"));
var auth = authenticationManagerBuilder.getObject().authenticate(authToken);
SecurityContextHolder.getContext().setAuthentication(auth);
var jwt = JwtUtil.createToken(SecurityContextHolder.getContext().getAuthentication());
System.out.println(jwt);
var cookie = new Cookie("jwt", "jwt");
cookie.setMaxAge(10);
cookie.setHttpOnly(true);
cookie.setPath("/");
response.addCookie(cookie);
return jwt;
}
package com.example.shop.member;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import org.springframework.security.core.Authentication;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.stream.Collectors;
@Component
public class JwtUtil {
static final SecretKey key =
Keys.hmacShaKeyFor(Decoders.BASE64.decode(
"jwtpassword123jwtpassword123jwtpassword123jwtpassword123jwtpassword"
));
// JWT 만들어주는 함수
public static String createToken(Authentication auth) {
var user = (CustomUser) auth.getPrincipal();
var authorities =auth.getAuthorities().stream().map(a-> a.getAuthority()).collect(Collectors.joining(","));
String jwt = Jwts.builder()
.claim("username", user.getUsername())
.claim("displayName", user.displayName)
.claim("authorities", authorities)
.issuedAt(new Date(System.currentTimeMillis()))
.expiration(new Date(System.currentTimeMillis() + 10000)) //유효기간 10초
.signWith(key)
.compact();
return jwt;
}
// JWT 까주는 함수
public static Claims extractToken(String token) {
Claims claims = Jwts.parser().verifyWith(key).build()
.parseSignedClaims(token).getPayload();
return claims;
}
}