nankdh327
수강평 작성수
-
평균평점
-
블로그
전체 11![[인프런 워밍업 클럽] 3번째 발자국](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 03. 11.
0
[인프런 워밍업 클럽] 3번째 발자국
저번주에 인강을 100프로 완료를 달성하고 미니 프로젝트 1단계를 끝냈다.. 포기하지 않고 끝까지 달려온 나에게 칭찬을 해주고 싶다.다른 공부와 연계하면서 시간도 부족했고 새로운 도전이라 어려운점도 있어서 스스로 해결하는 것이 아닌 다른 사람들이 올린 코드를 보고 이해를 바탕으로 조금씩 진행을 하였다.스스로 작성을 한 것이 아니라 조금 아쉽지만 이 과정이 끝나고 스스로 계속 돌려보면서 스스로 할 수 있는 수준까지 계속 나아갈 것이다.이렇게 좋은 과정이 있다는 것에 다행이였고 이렇게 좋은 강의를 듣게 되어서 정말 감사합니다.
![[미니 프로젝트] Step 1](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 03. 07.
0
[미니 프로젝트] Step 1
controllerpackage com.example.company.controller; import com.example.company.dto.MemberResponse; import com.example.company.dto.TeamResponse; import com.example.company.dto.createTeamRequest; import com.example.company.dto.createMemberRequest; import com.example.company.service.CompanyService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class CompanyController { private CompanyService companyService; public CompanyController(CompanyService companyService) { this.companyService = companyService; } @PostMapping("api/team") public void saveTeam(@RequestBody createTeamRequest request){ companyService.saveTeam(request); } @PostMapping("api/member") public void saveMember(@RequestBody createMemberRequest request){ companyService.saveMember(request); } @GetMapping("api/team") public List getTeams(){ return companyService.getTeams(); } @GetMapping("api/member") public List getMembers(){ return companyService.getMembers(); } } teampackage com.example.company.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private String managerName; private long memberCount; public Team(String name) { this.name = name; } public void setTeamManager(String name){ this.managerName = name; } public void setMemberCount(){ this.memberCount++; } } create team requestpackage com.example.company.dto; import lombok.Getter; @Getter public class createTeamRequest { private String name; } team repositorypackage com.example.company.repository; import com.example.company.domain.Team; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; @Repository public interface TeamRepository extends JpaRepository { Optional findByName(String name); } company service@Transactional public void saveTeam(createTeamRequest request){ teamRepository.save(new Team(request.getName())); } team responsepackage com.example.company.dto; import com.example.company.domain.Team; import lombok.Getter; @Getter public class TeamResponse { private String name; private String manager; private long memberCount; public TeamResponse(Team team) { this.name = team.getName(); this.manager = team.getManagerName(); this.memberCount = team.getMemberCount(); } } company servicepublic List getTeams(){ List teams = teamRepository.findAll(); return teams.stream() .map(TeamResponse::new) .collect(Collectors.toList()); } memberpackage com.example.company.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.LocalDate; @Entity @Getter @NoArgsConstructor public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private long teamId; @Enumerated(EnumType.STRING) private Role role; private LocalDate birthday; private LocalDate workStartDate; public Member(String name, long teamId, Role role, LocalDate birthday, LocalDate workStartDate) { this.name = name; this.teamId = teamId; this.role = role; this.birthday = birthday; this.workStartDate = workStartDate; } } rolepackage com.example.company.domain; public enum Role { Manager, Member; } create member requestpackage com.example.company.dto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import java.time.LocalDate; @Getter public class createMemberRequest { private String name; private String teamName; @JsonProperty("isManager") private boolean isManager; private LocalDate workStartDate; private LocalDate birthday; } member repositorypackage com.example.company.repository; import com.example.company.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; public interface MemberRepository extends JpaRepository { } company service@Transactional public void saveMember(createMemberRequest request){ Team team = teamRepository.findByName(request.getTeamName()) .orElseThrow(IllegalArgumentException::new); Role role = request.isManager() ? Role.Manager : Role.Member; memberRepository.save(new Member(request.getName(),team.getId(), role, request.getBirthday(), request.getWorkStartDate())); if(role.equals(Role.Manager)){ team.setTeamManager(request.getName()); teamRepository.save(team); } team.setMemberCount(); teamRepository.save(team); } 스스로 풀어보고자 하였으나... 접근을 어떤식으로 해야할지 감이 안잡혀 어떤 하나를 잡고 인강을 들으면서 ppt 자료를 같이 참고하여 이해를 하면서 따라 쳐보는 식으로 하였습니다. 남은 기간 동안 계속 돌리면서 익히고 암기하는 식으로 진행하겠습니다.
![[인프런 워밍업 클럽] 2주차 발자국](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 03. 03.
0
[인프런 워밍업 클럽] 2주차 발자국
현재 나의 상태 : 다른 수업들에서는 이클립스를 사용하기 때문에 아직 많이 친해지지 못했음수업 내용이 어렵고 계속 어떤걸 잘못 했는지 오류가 계속 나서 찾아보기도 하고 다시 타이핑도 해보느라 진도를 많이 못 나갔음 칭찬하고 싶은 점 : 일단은 틈틈히 인강을 듣고 있고, 이클립스 못지않게 친해지려고 부단히 노력중이라는 점은 칭찬해주고 싶음백앤드 개발자가 되려면 스프링은 알아야 한다는 말에 지원을 해서 모르더라도 완주하려는 의지에 내가 내 스스로에게 응원의 칭찬을 해주고 싶음 아쉬운점: 수업이 어렵고 등의 너무 나약한 변명인 거 같다.. 그냥 단순히 시간 분배를 잘 못한거 같은 느낌을 많이 들었다. 시간 분배를 더 잘해보자는 다짐을 한 한주였다. 다음주의 목표남은 인강 다 듣고 2회독 시작을 목표로 하고 있다 .
![[인프런 워밍업 클럽_0기 BE] 일곱번째 과제](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 27.
0
[인프런 워밍업 클럽_0기 BE] 일곱번째 과제
@Entity(name="fruit") @NoArgsConstructor @Getter public class Fruit { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private LocalDate warehousingDate; private long price; private boolean isSold; public Fruit(String name, LocalDate warehousingDate, long price) { this.name = name; this.warehousingDate = warehousingDate; this.price = price; } public void updateIsSold(){ this.isSold = true; } } public interface FruitRepository extends JpaRepository { List findByNameAndIsSold(String name,boolean isSold); // 2번 List findAllByName(String name); // 3번 List findAllByPriceGreaterThanEqualAndIsSold(long price,boolean isSold); List findAllByPriceLessThanEqualAndIsSold(long price,boolean isSold); } public void saveFruit(Fruit fruit){ fruitRepository.save(fruit); } public void sellFruit(long id){ String sql = "UPDATE fruit SET isSold=1 WHERE id=?"; Fruit fruit = fruitRepository.findById(id) .orElseThrow(); fruit.updateIsSold(); fruitRepository.save(fruit); } // 2번 public FruitCountResponse countFruit(String name){ long count = fruitRepository.findAllByName(name).stream().count(); return new FruitCountResponse(count); } // 3번 public List returnFruitList(String option, long price){ if(option.equals("GTE")){ return fruitRepository.findAllByPriceGreaterThanEqualAndIsSold(price,false) .stream().map(fruit-> new FruitListResponse(fruit.getName(),fruit.getPrice(),fruit.getWarehousingDate())) .collect(Collectors.toList()); }else{ return fruitRepository.findAllByPriceLessThanEqualAndIsSold(price,false) .stream().map(fruit-> new FruitListResponse(fruit.getName(),fruit.getPrice(),fruit.getWarehousingDate())) .collect(Collectors.toList()); } } public FruitResponse calcPrice(String name){ long salesAmount = fruitRepository.findByNameAndIsSold(name,true) .stream().mapToLong(fruit->fruit.getPrice()).sum(); long notSalesAmount = fruitRepository.findByNameAndIsSold(name,false) .stream().mapToLong(fruit->fruit.getPrice()).sum(); return new FruitResponse(salesAmount,notSalesAmount); } @GetMapping("/api/v1/fruit/count") public FruitCountResponse countFruit(@RequestParam String name){ return fruitService.countFruit(name); } // 3번 @GetMapping("/api/v1/fruit/list") public List returnFruitList(@RequestParam String option, long price){ return fruitService.returnFruitList(option,price); } @Getter public class FruitCountResponse { private long count; public FruitCountResponse(long count) { this.count = count; } } @Getter public class FruitListResponse { private String name; private long price; private LocalDate warehousingDate; public FruitListResponse(String name, long price, LocalDate warehousingDate) { this.name = name; this.price = price; this.warehousingDate = warehousingDate; } } 과제를 하면서 많은 에러상황들이 있었고 한번에 내 것으로 만드는 것이 안될꺼 같아 자주 돌려보며 나중에 싹 다 지우고 다시 만들어 봐야 겠다는 생각을 하였음혼자서 코드를 짜는게 아닌 다른 사람이 적은 코드를 보고 모르는 것들은 찾아 최대한 이해를 하는 식으로 접근을 하였음
![[인프런 워밍업 클럽] 6일차 과제](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 26.
0
[인프런 워밍업 클럽] 6일차 과제
1. controller에서 service를 호출하고 service에서 repository를 호출해서 가져와 쓰는 상황을 만들어서 해보자FruitRepository를 FruitMemoryRepository와 FruitSqlRepository로 나누어 보자@RestController public class FruitController { private final FruitService fruitService; public FruitController(FruitService fruitService) { this.fruitService = fruitService; } @PostMapping("/api/v1/fruit") public void saveFruit(@RequestBody Fruit fruit){ fruitService.saveFruit(fruit); } @PutMapping("/api/v1/fruit") public void sellFruit(@RequestBody Map body){ fruitService.sellFruit(body.get("id")); } @GetMapping("/api/v1/fruit") public FruitResponse calcPrice(@RequestParam String name){ return fruitService.calcPrice(name); } } @Service public class FruitService { private final FruitRepository fruitRepository; public FruitService(FruitRepository fruitRepository) { this.fruitRepository = fruitRepository; } public void saveFruit(Fruit fruit){ fruitRepository.saveFruit(fruit); } public void sellFruit(long id){ fruitRepository.sellFruit(id); } public FruitResponse calcPrice(String name){ return fruitRepository.calcPrice(name); } } @Repository public class FruitRepository { private final JdbcTemplate jdbcTemplate; public FruitMySqlRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void saveFruit(Fruit fruit){ String sql = "INSERT INTO fruit (name,warehousingDate,price) VALUES (?,?,?)"; jdbcTemplate.update(sql,fruit.getName(),fruit.getWarehousingDate(),fruit.getPrice()); } public void sellFruit(long id){ String sql = "UPDATE fruit SET isSold=1 WHERE id=?"; jdbcTemplate.update(sql,id); } public FruitResponse calcPrice(String name){ String sql1 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?"; String sql2 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?"; long salesAmount = jdbcTemplate.queryForObject(sql1,Long.class,name,1); long notSalesAmount = jdbcTemplate.queryForObject(sql2,Long.class,name,0); return new FruitResponse(salesAmount,notSalesAmount); } } FruitRepository를 FruitMemoryRepository 와 FruitMySqlRepository로 나누기 @Primary 어노테이션 활용하기 public interface FruitRepository { void saveFruit(Fruit fruit); void sellFruit(long id); FruitResponse calcPrice(String name); } @Repository @Primary public class FruitMySqlRepository implements FruitRepository { private final JdbcTemplate jdbcTemplate; public FruitMySqlRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void saveFruit(Fruit fruit){ String sql = "INSERT INTO fruit (name,warehousingDate,price) VALUES (?,?,?)"; jdbcTemplate.update(sql,fruit.getName(),fruit.getWarehousingDate(),fruit.getPrice()); } public void sellFruit(long id){ String sql = "UPDATE fruit SET isSold=1 WHERE id=?"; jdbcTemplate.update(sql,id); } public FruitResponse calcPrice(String name){ String sql1 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?"; String sql2 = "SELECT SUM(price) FROM fruit WHERE name=? AND isSold=?"; long salesAmount = jdbcTemplate.queryForObject(sql1,Long.class,name,1); long notSalesAmount = jdbcTemplate.queryForObject(sql2,Long.class,name,0); return new FruitResponse(salesAmount,notSalesAmount); } } @Repository public class FruitMemoryRepository implements FruitRepository{ private final List fruits = new ArrayList(); @Override public void saveFruit(Fruit fruit) { fruits.add(fruit); } @Override public void sellFruit(long id) { Fruit fruit = fruits.get(id); if(fruit!= null){ fruit.setSold(1); } } @Override public FruitResponse calcPrice(String name) { long num1 = fruits.stream().filter(f -> f.getName().equals(name) && f.isSold()).mapToLong(Fruit::getPrice).sum(); long num2 = fruits.stream().filter(f -> f.getName().equals(name) && !f.isSold()).mapToLong(Fruit::getPrice).sum(); return new FruitResponse(num1,num2); } } 시간이 너무 부족하여 고민하는 시간이 너무 부족했고 고민해보다가 결국 다른 사람들것을 참고하면서 이해가 잘되는 코드를 찾아 내것으로 이해하는 식의 과제를 하였습니다. 조금씩의 성장하는 모습이 있어야 하는데 그러는 기미가 별로 보이지 않아 많이 답답하며서 초조해지니 더 손에 잘 안잡히는거 같습니다. 조금 더 전진해보겠습니다.
![[인프런 워밍업 클럽] 1주차 발자국](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 25.
0
[인프런 워밍업 클럽] 1주차 발자국
현재 나의 상태 :이클립스만 사용했다가 처음 인텔리제이를 설치하고 친해지려고 노력하고 있는 중입니다.자바 및 다른 언어들을 탄탄하게 잡지 못한 상태에서 백엔드 개발자의 큰 꿈을 갖고 무작정 패기로 지원하여 듣고 있음. 칭찬하고 싶은점 : 다른 교육과정과 병행하면서 듣고 있지만 힘들다고 포기하지 않고 꾸준하게 진도에 맞춰 인강을 듣고 과제를 제출한 점은 정말 뿌듯하고 제 자신에게 대견했던 한 주였던거 같습니다. 아쉬운점, 더 나아져야 할 부분 : 인텔리제외와의 친숙함이 부족, 알고리즘이 많이 부족해서 고민하는 시간은 많았지만 혼자 스스로 해결은 못하고 다른 사람이 올린 걸 이해하고 작성 및 검색을 통해 과제를 해결한 점이 많이 아쉬웠던 한 주였던거 같습니다. 다음주의 목표 : 인텔리제이와 친해지기과제를 혼자 스스로 해결할 수 있도록 노력하기1주차와 마찬가지로 진도 놓치지 않고 강의 듣고 공부하기복습 탄탄하게 하기 일주차에 했던 과제들...1일차 : https://www.inflearn.com/blogs/65582일차 : https://www.inflearn.com/blogs/65933일차 : https://www.inflearn.com/blogs/66494일차 : https://www.inflearn.com/blogs/66965일차 : https://www.inflearn.com/blogs/6731
![[인프런 워밍업 클럽] 5일차 과제 클린코드 (주사위)](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 23.
0
[인프런 워밍업 클럽] 5일차 과제 클린코드 (주사위)
[제시된 코드]여러 함수로 나누어도 좋습니다! 🙂여러 클래스로 나누어도 좋습니다! 🙂 코드class DiceDao{ // 숫자를 입력받아 주사위의 면 갯수를 만들어주는 메소드 list를 반환 public List diceNumCollector(int num){ List list = new ArrayList(); for (int i = 0; i list, int num){ Random random = new Random(); for(int i = 0; i 메인public class Main { public static void main(String[] args) { final DiceDao dao = new DiceDao(); dao.result(dao.diceNumCollector(6), dao.enterNum()); } }
![[인프런 워밍업 클럽] 4차 과제](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 22.
0
[인프런 워밍업 클럽] 4차 과제
문제풀기 전에 간단하게 테이블을 생성하였음create table fruit ( id bigint auto_increment primary key, name varchar(20), warehousingDate date, price long, is_sold boolean default 0, );생성자를 만들어 주었음 (dto) 과일정보를 저장하는 API를 만들어 보기 @PostMapping("/api/v1/fruit") public void saveFruit(@RequestBody FruitInfoRequest request) { String sql = "insert into fruit (name, warehousingDate, price) values (?, ?, ?)"; // 쿼리 작성 jdbcTemplate.update(sql, request.name(), request.warehousingDate(), request.price()); } 과일이 팔리게 되면, 우리 시스템에 팔린 과일 정보를 기록@PutMapping("/api/v1/fruit") public void updateFruit(@RequestBody FruitIdRequest request) { String readSql = "select * from fruit where id = ?"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.id()).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException("해당하는 과일이 존재하지 않습니다."); } //예외처리 작성 String sql = "update fruit set is_sold = 1 where id = ?"; // 쿼리 작성 jdbcTemplate.update(sql, request.id()); } } 특정 과일을 기준으로 팔린 금액, 팔리지 않은 금액 조회@GetMapping("/api/v1/fruit/stat") public FruitAmountResponse getAmount(@RequestParam String name) { String readSql = "select * from fruit where name = ?"; boolean isFruitNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty(); if (isFruitNotExist) { throw new IllegalArgumentException("해당하는 과일이 존재하지 않습니다."); } //예외처리 작성 String sql1 = "select sum(price) as salesAmount from fruit where is_sold = 1"; String sql2 = "select sum(price) as notSalesAmount from fruit where is_sold = 0"; Long salesAmount = jdbcTemplate.queryForObject(sql1, (rs, rowNum) -> rs.getLong("salesAmount")); Long notSalesAmount = jdbcTemplate.queryForObject(sql2, (rs, rowNum) -> rs.getLong("notSalesAmount")); return new FruitAmountResponse(salesAmount, notSalesAmount); } }
![[인프런 워밍업 클럽] 3차 람다에 대해서](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 21.
0
[인프런 워밍업 클럽] 3차 람다에 대해서
자바의 람다식의 등장람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까? 익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스람다식이란 함수를 하나의 식으로 표현한 것 옛날에 자바에서는 익명 내부 클래스를 사용하여 함수형 인터페이스를 구현했지만, 이는 코드가 길어지고 가독성이 떨어지는 단점이 있었음 그래서 자바에서 람다가 등장한 배경은 주로 코드를 간결하게 작성하고, 함수형 프로그래밍 스타일을 지원하기 위해서 등장 람다에도 함수형 프로그램이 있지만 옛날의 함수 인터페이스와는 다르다람다식의 특징 : 람다식은 코드를 간결하게 작성하고 유연하게 구성할 수 있는 도구로 함수형 프로그래밍 스타일을 지원하여 병렬 및 동시성 프로그래밍에 유용하게 활용됩니다.함수는 일반적 용어인 반면 메서드는 객체지향 개념의 용어 -> 인터페이스 정의 :@FunctionalInterfaceinterface MyInterface {void myMethod(int a, int b);}=> @FunctionalInterface : 이것의 역활은 인터페이스를 명시적으로 선언하기 위한 어노테이션즉 이 것을 사용하는 메서드는 해당 인터페이스가 함수형 인터페이스임을 검사하도록 지시-> 람다식 사용 :public class Main {public static void main(String[] args) {// 람다식을 사용하여 MyInterface 인터페이스를 구현MyInterface myLambda = (a, b) -> System.out.println("Sum: " + (a + b));// 람다식을 호출myLambda.myMethod(5, 3); // 출력: Sum: 8}}익명클래스 : 이름이 없는 클래스, 한번만 사용할 수 있고 하나의 객체만을 생성하기 위한 일회용 클래스
![[인프런 워밍업 클럽] 2일차 GET POST API 만들어 보자](https://cdn.inflearn.com/public/main/blog/default_thumbnail.png?w=260)
2024. 02. 20.
0
[인프런 워밍업 클럽] 2일차 GET POST API 만들어 보자
문제 1 : 두 수를 입력 하면 다음과 같은 결과가 나오는 API 만들어 보기접근 순서 입력 받을 숫자 2개에 대한 DTO를 생성public class CalculatorNumbers { private int num1; private int num2; // 생성자 public CalculatorNumbers(int num1, int num2) { this.num1 = num1; this.num2 = num2; } // get메서드 public int getNum1() { return num1; } public int getNum2() { return num2; } }합,차,곱에 대한 DTO를 생성 (위에 꺼를 import를 해줘야 함)package com.group.libraryapp.dto.response; import com.group.libraryapp.dto.calculator.request.CalculatorNumbers; public class CalculationResponse { private int add; private int minus; private int multiply; public CalculationResponse(CalculatorNumbers numbers) { this.add = numbers.getNum1() + numbers.getNum2(); this.minus = numbers.getNum1() / numbers.getNum2(); this.multiply = numbers.getNum1() * numbers.getNum2(); } public int getAdd() { return add; } public int getMinus() { return minus; } public int getMultiply() { return multiply; } }시작 시점에 메서드를 만들어 준다@GetMapping("/calc") public CalculationResponse CalculatorNumberslist (CalculatorNumbers request) { return new CalculationResponse(request); } 문제 2 : 날짜를 입력하면 원하는 값을 가지고 오는 방식-> 날짜 입력은 String 타입으로 들어감-> dayofweek 는 요일을 영어로 출력함문제 접근 순서입력 받을 날짜의 DTO를 만들어 준다public class LocalDateRequest { private DayOfWeek dayOfTheWeek; public String getDayOfWeek() { return dayOfTheWeek.toString().substring(0,3); } public LocalDateRequest(String day) { this.dayOfTheWeek = LocalDate.parse(day).getDayOfWeek(); } }시작 시점에 메서드를 만들어 준다@GetMapping("/day-of-the-week") public LocalDateRequest DayCheck(@RequestParam String date) { return new LocalDateRequest(date); } }문제 3 : 입력한 숫자들의 합을 구하시오접근 순서 : 연속된 숫자를 입력받아야 하기 때문에 배열 형태로 값을 입력받게 만들어준다public class NumberTotal { List numbers; public void setNumber(List numbers) { this.numbers = number; } public int totSum() { int total = 0; for (int num : numbers) { total += num; } return total; } }시작 지점에 메서드를 만들어 준다@GetMapping("/listsum") public int Sumlist(@RequestBody NumberTotal numbers) { return numbers.totSum(); }




