μŠ€ν”„λ§ μž…λ¬Έ - (8) νšŒμ› 관리 예제

2023. 1. 15. 17:38Β·Spring/Spring μž…λ¬Έ

 

λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­ 정리

데이터: νšŒμ›ID, 이름
κΈ°λŠ₯
: νšŒμ› 등둝, 쑰회
아직 데이터 μ €μž₯μ†Œκ°€ μ„ μ •λ˜μ§€ μ•ŠμŒ
(κ°€μƒμ˜ μ‹œλ‚˜λ¦¬μ˜€)

 

νšŒμ› 도메인과 리포지토리 λ§Œλ“€κΈ°

 

νšŒμ› 객체

domain νŒ¨ν‚€μ§€μ— Member 클래슀 생성 

 

hello.hellospring.domain

package hello.hellospring.domain;

public class Member {

    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

νšŒμ› 리포지토리 μΈν„°νŽ˜μ΄μŠ€

repository 

νšŒμ›κ°μ²΄λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ €μž₯μ†Œ

 

MemberRepository μΈν„°νŽ˜μ΄μŠ€ 생성 

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

 

μžλ°”μ˜ Interface 문법 

더보기

void feed(Tiger tiger) { // ν˜Έλž‘μ΄κ°€ 였면 사과λ₯Ό 던져 μ€€λ‹€. System.out.println("feed apple"); }

 

void feed(Lion lion) { // μ‚¬μžκ°€ 였면 λ°”λ‚˜λ‚˜λ₯Ό λ˜μ Έμ€€λ‹€. System.out.println("feed banana");

 

μž…λ ₯κ°’μ˜ μžλ£Œν˜• νƒ€μž…μ΄ λ‹€λ₯Ό 경우(μœ„μ—μ„œλŠ” Tiger, Lion으둜 μ„œλ‘œ λ‹€λ₯΄λ‹€) λ©”μ„œλ“œ λͺ…을 λ™μΌν•˜κ²Œ(μ—¬κΈ°μ„œλŠ” λ©”μ„œλ“œλͺ…이 feed둜 λ™μΌν•˜λ‹€) μ‚¬μš©ν•  수 μžˆλ‹€.

μ΄λŸ°κ²ƒμ„ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©(Method overloading)이라고 ν•œλ‹€.

 

동물원에 ν˜Έλž‘μ΄μ™€ μ‚¬μžλΏμ΄λΌλ©΄ ZooKeeper ν΄λž˜μŠ€λŠ” 더 이상 할일이 μ—†κ² μ§€λ§Œ

μ•…μ–΄, ν‘œλ²” 등이 계속 μΆ”κ°€λœλ‹€λ©΄ ZooKeeperλŠ” μœ‘μ‹λ™λ¬Όμ΄ 좔가될 λ•Œλ§ˆλ‹€ 맀번 λ‹€μŒκ³Ό 같은 feed λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

이런 어렀움을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ 도움이 ν•„μš”ν•˜λ‹€.

 

μΈν„°νŽ˜μ΄μŠ€λŠ” interface ν‚€μ›Œλ“œλ₯Ό 톡해 μ„ μ–Έν•  수 있으며 implements ν‚€μ›Œλ“œλ₯Ό 톡해 일반 ν΄λž˜μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„

 

interface Predator {

String getFood();

}

 

 

μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” λ©”μ„œλ“œμ˜ 이름과 μž…μΆœλ ₯에 λŒ€ν•œ μ •μ˜λ§Œ 있고 κ·Έ λ‚΄μš©μ€ μ—†λ‹€.

κ·Έ μ΄μœ λŠ” μΈν„°νŽ˜μ΄μŠ€λŠ” κ·œμΉ™μ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

μœ„μ—μ„œ μ„€μ •ν•œ getFoodλΌλŠ” λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό implementsν•œ ν΄λž˜μŠ€λ“€μ΄ κ΅¬ν˜„ν•΄μ•Όλ§Œ ν•˜λŠ” 것이닀.

 

class Tiger extends Animal implements Predator {

public String getFood() {

return "apple";

  }

}

 

μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œλŠ” 항상 public으둜 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

 

https://wikidocs.net/217

 

05-07 μΈν„°νŽ˜μ΄μŠ€

μΈν„°νŽ˜μ΄μŠ€(Interface)λŠ” 초보 개발자λ₯Ό κ΄΄λ‘­νžˆλŠ” λ‹¨κ³¨μ†λ‹˜μ΄λ‹€. μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ κ°œλ…μ—†μ΄ μ½”λ“œλ‘œλ§Œ μ΄ν•΄ν•˜λ €κ³  ν•˜λ©΄ κ³§ 미ꢁ에 λΉ μ§€κ²Œ λœλ‹€. μ΄λ ‡κ²Œ μ΄ν•΄ν•˜κΈ° νž˜λ“  μΈν„°νŽ˜μ΄μŠ€…

wikidocs.net

 

 

νšŒμ› 리포지토리 λ©”λͺ¨λ¦¬ κ΅¬ν˜„μ²΄

 

MemoryMemberRepsoitory 클래슀 생성 

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;


public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
         member.setId(++sequence);
         store.put(member.getId(),member);
         return member;

    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}

 

 

public Member save(Member member) {
     member.setId(++sequence);
     store.put(member.getId(),member);
     return member;

store에 넣기전에  member에 sequence 값을 올렀 id 값을 μ„ΈνŒ…

 

 

@Override
public Optional<Member> findById(Long id) {
    return Optional.ofNullable(store.get(id));

ofNullalbe() : null 이여도 κ°μŒ€ 수 μžˆλ„λ‘ 

 

 

Optionalμ΄λž€? 

더보기

 NPE(NullPointerException) μ΄λž€? ]

κ°œλ°œμ„ ν•  λ•Œ κ°€μž₯ 많이 λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ NPE(NullPointerException)이닀.

NPEλ₯Ό ν”Όν•˜λ €λ©΄ null μ—¬λΆ€λ₯Ό 검사해야 ν•˜λŠ”λ°, null 검사λ₯Ό ν•΄μ•Ό ν•˜λŠ” λ³€μˆ˜κ°€ λ§Žμ€ 경우 μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κ³  λ²ˆκ±°λ‘­λ‹€.

κ·Έλž˜μ„œ null λŒ€μ‹  μ΄ˆκΈ°κ°’μ„ μ‚¬μš©ν•˜κΈΈ ꢌμž₯ν•˜κΈ°λ„ ν•œλ‹€.

 

[ Optionalμ΄λž€? ]

Java8μ—μ„œλŠ” Optional <T> 클래슀λ₯Ό μ‚¬μš©ν•΄ NPEλ₯Ό λ°©μ§€ν•  수 μžˆλ„λ‘ 도와쀀닀. 

Optional<Optional <T>λŠ”null이 올 수 μžˆλŠ” 값을 κ°μ‹ΈλŠ” Wrapper 클래슀둜, μ°Έμ‘°ν•˜λ”λΌλ„ NPEκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ 도와쀀닀. Optional ν΄λž˜μŠ€λŠ” μ•„λž˜μ™€ 같은 value에 값을 μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— 값이 null이더라도 λ°”λ‘œ NPEκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©°,

클래슀이기 λ•Œλ¬Έμ— 각쒅 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•΄ μ€€λ‹€.

 

 

 

https://mangkyu.tistory.com/70

 

 

@Override
public Optional<Member> findByName(String name) {
    return store.values().stream()
            .filter(member -> member.getName().equals(name))
            .findAny();

 

λžŒλ‹€(Lambda)

더보기

μžλ°”λŠ” Java 8 버전뢀터 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ λžŒλ‹€(Lambda)와 슀트림(Stream)이 λ„μž…λ˜μ—ˆλ‹€.

λžŒλ‹€μ™€ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ μš”μƒˆ μœ ν–‰ν•˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌλ‘œ μžλ°” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

λžŒλ‹€μ™€ μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μž‘μ„±ν•˜λŠ” μ½”λ“œμ˜ 양이 쀄어듀고 읽기 μ‰¬μš΄ μ½”λ“œλ₯Ό λ§Œλ“œλŠ”λ° μœ λ¦¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

λžŒλ‹€μ‹μ„ κ°„λ‹¨νžˆ μ •μ˜ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ‹λ³„μž 없이 μ‹€ν–‰ κ°€λŠ₯ν•œ ν•¨μˆ˜ ν‘œν˜„μ‹

 

Calculator μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ MyCalculator 클래슀λ₯Ό μƒμ„±ν•˜μ˜€λ‹€.

그러면 이제 MyCalculator ν΄λž˜μŠ€λŠ” λ‹€μŒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.

interface Calculator {
    int sum(int a, int b);
}

class MyCalculator implements Calculator {
    public int sum(int a, int b) {
        return a+b;
    }
}

public class Sample {
    public static void main(String[] args) {
        MyCalculator mc = new MyCalculator();
        int result = mc.sum(3, 4);
        System.out.println(result);  // 7 좜λ ₯
    }
}

 

λžŒλ‹€λ₯Ό μ μš©ν•œ μ½”λ“œ

이제 μœ„μ—μ„œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό λ‹€μŒμ²˜λŸΌ λžŒλ‹€λ₯Ό μ μš©ν•œ μ½”λ“œλ‘œ λ°”κΎΈμ–΄ 보자.

interface Calculator {
    int sum(int a, int b);
}

public class Sample {
    public static void main(String[] args) {
        Calculator mc = (int a, int b) -> a +b;
        int result = mc.sum(3, 4);
        System.out.println(result);
    }
}

μœ„ μ½”λ“œμ—μ„œ μ‚¬μš©ν•œ λžŒλ‹€ ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

(int a, int b) -> a +b

 

Stream

더보기

 

슀트림의 사전적 μ˜λ―ΈλŠ” '흐λ₯΄λ‹€' λ˜λŠ” '개울'μž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ μŠ€νŠΈλ¦Όλ„ 사전적 μ˜λ―Έμ™€ 크게 λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ, μ—¬κΈ°μ„œλŠ” 물이 흐λ₯΄λŠ” 것은 μ•„λ‹ˆκ³  'λ°μ΄ν„°μ˜ 흐름'을 λ§ν•©λ‹ˆλ‹€.

 

 

 

λ­”κ°€ μΆ”μƒμ μœΌλ‘œλŠ” λŒ€μΆ© 데이터가 흐λ₯΄κ² κ΅¬λ‚˜.

 

μ»¬λ ‰μ…˜, λ°°μ—΄ 등에 μ €μž₯된 μš”μ†Œλ“€μ„ ν•˜λ‚˜μ”© μ°Έμ‘°ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

Stream을 μ‚¬μš©ν•˜λ©΄, λΆˆν•„μš”ν•œ for문을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 수 있고, λžŒλ‹€μ‹μ„ ν™œμš©ν•  수 μžˆμ–΄μ„œ μ½”λ“œλ₯Ό μ§κ΄€μ μ΄κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

슀트림 μƒμ„±ν•˜κΈ° 

 

 

슀트림의 쀑간 μ—°μ‚° λͺ©λ‘ 

- Stream<T> distinct() 									#쀑볡을 제거
- Stream<T> filter(Predicate<T> predicate) 				#쑰건에 μ•ˆ λ§žλŠ” μš”μ†Œ μ œμ™Έ
- Stream<T> limit(long maxSize) 						#슀트림의 일뢀λ₯Ό μž˜λΌλƒ„
- Stream<T> skip(long n) 								#슀트림의 일뢀λ₯Ό κ±΄λ„ˆλœ€
- Stream<T> peek(Consumer<T> action) 					#슀트림의 μš”μ†Œμ— μž‘μ—…μˆ˜ν–‰
- Stream<T> sorted()									#슀트림의 μš”μ†Œλ₯Ό μ •λ ¬
  Stream<T> sorted(Comparator<T> comparator) 		
- Stream<R>    map(Function<T,R> mapper)				#슀트림의 μš”μ†Œλ₯Ό λ³€ν™˜
  DoubleStream mapToDouble(ToDoubleFunction<T> mapper)
  IntStream    mapToInt(ToIntFunction<T> mapper)
  LongStream   mapToLong(ToLongFunction<T> mapper)
  Stream<R>    flatmap(Function<T,Stream<R>> mapper)
  DoubleStream flatMapToDouble(Function<T,DoubleStream> m)
  IntStream    flatMapToInt(Function<T,IntStream> m)
  LongStream   flatMapToLong(Function<T,LongStream> m)

 

슀트림의 μ΅œμ’… μ—°μ‚° λͺ©λ‘

- void forEach(Consumer<? super T> action)				 #각 μš”μ†Œμ— μ§€μ •λœ μž‘μ—… μˆ˜ν–‰
  void forEachOrdered(Consumer<? super T> action)
- long count()											 #슀트림의 μš”μ†Œμ˜ 개수 λ°˜ν™˜
- Optional<T> max(Comparator<? super T> comparator)      #슀트림의 μ΅œλŒ€κ°’/μ΅œμ†Œκ°’μ„ λ°˜ν™˜
  Optional<T> min(Comparator<? super T> comparator)
- Optional<T> findAny()		# μ•„λ¬΄κ±°λ‚˜ ν•˜λ‚˜				 #슀트림의 μš”μ†Œ ν•˜λ‚˜λ₯Ό λ°˜ν™˜
  Optional<T> findFirst()	# 첫 번째 μš”μ†Œ				
- boolean allMatch(Predicate<T> p) # λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ”μ§€		#μ£Όμ–΄μ§„ 쑰건을 λͺ¨λ“  μš”μ†Œκ°€ λ§Œμ‘±μ‹œν‚€λŠ”μ§€, λ§Œμ‘±μ‹œν‚€μ§€ μ•ŠλŠ”μ§€ 확인
  boolean anyMatch(Predicate<T> p) # ν•˜λ‚˜λΌλ„ λ§Œμ‘±ν•˜λŠ”μ§€
  boolean noneMatch(Predicate<> p) # λͺ¨λ‘ λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”μ§€
- Object[] toArray()
  A[]      toArray(IntFunction<A[]> generator)			 # 슀트림의 λͺ¨λ“  μš”μ†Œλ₯Ό λ°°μ—΄λ‘œ λ°˜ν™˜
- Optinal<T> reduce(BinaryOperator<T> accumulator)		  #슀트림의 μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© μ€„μ—¬κ°€λ©΄μ„œ(리듀싱) 계산
  T reduce(T identity, BinaryOperator<T> accumulator)
  U reduce(U identity, BiFunction<U,T,U> accumulator,BinaryOperator<U> combiner)
- R collect(Collector<T,A,R> collector)					  #슀트림의 μš”μ†Œλ₯Ό μˆ˜μ§‘ν•œλ‹€. 주둜 μš”μ†Œλ₯Ό κ·Έλ£Ήν™” ν•˜κ±°λ‚˜ λΆ„ν• ν•œ κ²°κ³Όλ₯Ό μ»¬λ ‰μ…˜μ— 담에 λ°˜ν™˜ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.

 

https://velog.io/@chamominedev/%EC%8A%A4%ED%8A%B8%EB%A6%BCstream%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

 

Stream.filter()

더보기

filter()λŠ” 인자둜 ν•¨μˆ˜λ₯Ό λ°›μœΌλ©°, μ–΄λ–€ 쑰건으둜 Stream의 μš”μ†Œλ“€μ„ ν•„ν„°λ§ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 인자둜 μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ—¬ ν•„ν„°λ§ν•˜λŠ” 쑰건을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜ μ˜ˆμ œλŠ” filter()λ₯Ό μ‚¬μš©ν•˜μ—¬ Stream의 μš”μ†Œλ“€ 쀑에 "c"둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄λ“€μ„ λͺ¨λ‘ ν•„ν„°λ§ν•©λ‹ˆλ‹€.

 

List<String> list =
        Arrays.asList("a1", "a2", "b1", "b2", "c2", "c1", "c3");
Stream<String> stream = list.stream();
Stream<String> filtered = stream.filter(s -> s.startsWith("c"));
filtered.forEach(System.out::println);

Output:

c2
c1
c3

 

λ°°μ—΄ 슀트림

μŠ€νŠΈλ¦Όμ„ μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € 생성을 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μŠ€νŠΈλ¦Όμ€ λ°°μ—΄ λ˜λŠ” μ»¬λ ‰μ…˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄μš©ν•΄μ„œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

배열은 λ‹€μŒκ³Ό 같이 Arrays.stream λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

1. String[] arr = new String[]{"a", "b", "c"};
2. Stream<String> stream = Arrays.stream(arr);
3. Stream<String> streamOfArrayPart = 
4.  Arrays.stream(arr, 1, 3); // 1~2 μš”μ†Œ [b, c]

 

 

Java - Stream findAny()

더보기

Streamμ—μ„œ μ–΄λ–€ 쑰건에 μΌμΉ˜ν•˜λŠ” μš”μ†Œ(element) 1개λ₯Ό 찾을 λ•Œ, findAny()와 findFirst() APIλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

findAny()λŠ” Streamμ—μ„œ κ°€μž₯ λ¨Όμ € νƒμƒ‰λ˜λŠ” μš”μ†Œλ₯Ό λ¦¬ν„΄ν•˜κ³ , 

findFirst()λŠ” 쑰건에 μΌμΉ˜ν•˜λŠ” μš”μ†Œλ“€ 쀑에 Streamμ—μ„œ μˆœμ„œκ°€ κ°€μž₯ μ•žμ— μžˆλŠ” μš”μ†Œλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

 

 

 

https://codechacha.com/ko/java8-stream-difference-findany-findfirst/

 

 

@Override
public List<Member> findAll() {
    return new ArrayList<>(store.values());
}

 

 

03-08 λ§΅ (Map)

더보기

 λ§΅(Map)의 κ°€μž₯ 큰 νŠΉμ§•μ΄λΌλ©΄ key둜 valueλ₯Ό μ–»μ–΄λ‚Έλ‹€λŠ” 점이닀. 

λ§΅(Map)은 사전(dictionary)κ³Ό λΉ„μŠ·ν•˜λ‹€

 

key                        value
people μ‚¬λžŒ
baseball 야ꡬ

HashMap <String, String> map = new HashMap <>();

map.put("people", "μ‚¬λžŒ");

map.put("baseball", "야ꡬ");

 

key와 valueλŠ” μœ„ μ˜ˆμ œμ—μ„œ 보듯이 put λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μΆ”κ°€ν•  수 μžˆλ‹€.

 

System.out.println(map.get("people")); // "μ‚¬λžŒ" 좜λ ₯

 

key에 ν•΄λ‹Ήν•˜λŠ” value값을 μ–»κΈ° μœ„ν•΄μ„œλŠ” get λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

map 객체의 ν‚€(Key) "people"에 λŒ€μ‘ν•˜λŠ” κ°’(Value) "μ‚¬λžŒ"이 좜λ ₯λœλ‹€.

 

https://wikidocs.net/208

 

 

 


 

 

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'Spring > Spring μž…λ¬Έ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μŠ€ν”„λ§ μž…λ¬Έ - (10) νšŒμ› μ„œλΉ„μŠ€ 개발  (0) 2023.01.20
μŠ€ν”„λ§ μž…λ¬Έ - (9) νšŒμ› 리포지토리 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±  (1) 2023.01.20
μŠ€ν”„λ§ μž…λ¬Έ - (7) API  (0) 2023.01.12
μŠ€ν”„λ§ μž…λ¬Έ - (6) MVC와 ν…œν”Œλ¦Ώ μ—”μ§„  (0) 2023.01.12
μŠ€ν”„λ§ μž…λ¬Έ - (5) 정적 컨텐츠  (0) 2023.01.12
'Spring/Spring μž…λ¬Έ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μŠ€ν”„λ§ μž…λ¬Έ - (10) νšŒμ› μ„œλΉ„μŠ€ 개발
  • μŠ€ν”„λ§ μž…λ¬Έ - (9) νšŒμ› 리포지토리 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μž‘μ„±
  • μŠ€ν”„λ§ μž…λ¬Έ - (7) API
  • μŠ€ν”„λ§ μž…λ¬Έ - (6) MVC와 ν…œν”Œλ¦Ώ μ—”μ§„
hello_u
hello_u
  • hello_u
    😜
    hello_u
  • 전체
    였늘
    μ–΄μ œ
    • 😜 (345)
      • Hardware (2)
        • BMC (2)
      • Spring (109)
        • Spring μž…λ¬Έ (20)
        • Spring κΈ°λ³Έ (27)
        • Spring MVC (18)
        • Spring DB (22)
        • Spring JPA κΈ°λ³Έ (16)
        • Spring JPA ν™œμš© (6)
      • Develop (27)
        • DB (8)
        • JAVA (4)
        • Web (2)
        • Python (7)
        • OSS (2)
        • Git (2)
        • API (2)
      • Algorithm (155)
        • CodeUp 기초 (44)
        • 파이썬 μ½”λ”©ν…ŒμŠ€νŠΈ (64)
        • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (4)
        • SWEA (30)
        • Softeer (10)
        • BOJ (2)
      • CS (9)
        • μ»΄ν“¨ν„°μΌλ°˜ (3)
        • 운영체제 (3)
        • λ°μ΄ν„°λ² μ΄μŠ€ (0)
        • 정보톡신 (1)
        • 자료ꡬ쑰 (1)
        • μ†Œν”„νŠΈμ›¨μ–΄ 곡학 (1)
        • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (0)
        • μ΅œμ‹  λ””μ§€ν„Έ, μΌλ°˜μƒμ‹ (0)
      • 자격증 (41)
        • μ •λ³΄λ³΄μ•ˆκΈ°μ‚¬ (9)
        • μ •λ³΄μ²˜λ¦¬κΈ°μ‚¬ (22)
        • λ¦¬λˆ…μŠ€λ§ˆμŠ€ν„° 1κΈ‰ (3)
        • SQLD (7)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
hello_u
μŠ€ν”„λ§ μž…λ¬Έ - (8) νšŒμ› 관리 예제
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”