묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
클라이언트와 서버
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]송신자를 클라이언트로 수신자를 서버로 예시를 들어주셨는데이부분이 좀 아리송합니다.분명 둘다 클라이언트이면서 서버일수 있는거 아닌가 해서요.그림상에서는 미국에있는 친구만 서버라고 하니까 좀 아리송합니다.클라이언트 패킷 전달 / 서버 패킷 전달 두 파트 부분에서 클라이언트가 한국에사는애, 서버가 미국에사는애로 예시를 들어주셨는데요.제가 이해하고 있던 부분은 각각의 클라이언트는 모두 서버를 갖는다는 개념입니다. 보내는 클라이언트가 가진 서버를 통해 받는 클라이언트의 서버에 전송하고반대로 받는 클라이언트의 서버가 보내 클라이언트의 서버에게 똑같이 전송하는 개념이요 아래 예시처럼 보내는 측면에서는 클라이언트고 받는 측면에서는 서버로 이해하는게 맞을까요?[ClientA가 ClientB에게 전송]Client A의 서버 → Client B의 서버[ClientB가 ClientA에게 전송]Client A의 서버 ← Client B의 서버이렇게 이해해야 하면 될까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
섹션3 로그인기능 구현 - react hook form
안녕하세요 수강중인데요지금까지 수강 마치고 항상 프로그램 실행이 정상적으로 돌아갓는데이번 reac hook form 강의에서 코드 실행해보면register 화면에서 유효성 검사 기능이 동작하질 않습니다강의 참고하여 vs로 필요한 install 전부 설치하엿고 에러도 없엇습니다이상해서 react hook 관련 구글링을 통해 다른 방법으로도 적용해보앗지만 여전히 동작을 안합니다원인을 모르겟네요 import React from 'react' import { useForm } from 'react-hook-form' import { useDispatch } from 'react-redux' //import { registerUser } from '../../store/thunkFunctions' const RegisterPage = () => { const { register, handleSubmit, formState: { errors }, reset } = useForm({ mode: 'onChange' }) //const dispatch = useDispatch(); const onSubmit = ({ email, password, name }) => { // dispatch(registerUser(body)); reset(); } const userEmail = register("email",{ required: { value : true, message : "필수 필드입니다."}, }); const userName = { required: "필수 필드입니다." } const userPassword = { required: '필수 필드입니다.', minLength: { value: 6, message: "최소 6자입니다." } } return ( <section className='flex flex-col justify-center mt-20 max-w-[400px] m-auto'> <div className='p-6 bg-white rounded-md shadow-md'> <h1 className='text-3xl font-semibold text-center'> 회원가입 </h1> <form className='mt-6' onSubmit={handleSubmit(onSubmit)}> <div className='mb-2'> <label htmlFor='email' className='text-sm font-semibold text-gray-800' >Email</label> <input type='email' id="email" className='w-full px-4 py-2 mt-2 bg-white border rounded-md' {...register('email', userEmail)} /> { errors?.email && <div> <span className='text-red-500'> {errors.email.message} </span> </div> } </div> <div className='mb-2'> <label htmlFor='name' className='text-sm font-semibold text-gray-800' >Name</label> <input type='text' id="name" className='w-full px-4 py-2 mt-2 bg-white border rounded-md' // {...register('name', userName)} /> {/* { errors?.name && <div> <span className='text-red-500'> {errors.name.message} </span> </div> } */} </div> <div className='mb-2'> <label htmlFor='password' className='text-sm font-semibold text-gray-800' >Password</label> <input type='password' id="password" className='w-full px-4 py-2 mt-2 bg-white border rounded-md' {...register('password', userPassword)} /> { errors?.password && <div> <span className='text-red-500'> {errors.password.message} </span> </div> } </div> <div className='mt-6'> <button type='submit' className='w-full px-4 py-2 text-white duration-200 bg-black rounded-md hover:bg-gray-700'> 회원가입 </button> </div> <p className='mt-8 text-xs font-light text-center text-gray-700'> 아이디가 있다면?{" "} <a href='/login' className='font-medium hover:underline' > 로그인 </a> </p> </form> </div> </section> ) } export default RegisterPage
-
미해결카프카 완벽 가이드 - 커넥트(Connect) 편
Debezium snapshot 질문
안녕하세요,Debezium에서 snapshot을 수행할 때 읽어오는 DB 스키마는 커넥터가 어디에 저장해두는건가요?레코드의 경우 config에 설정된 topic에 저장되고, 또 offset의 경우 connect-offsets이라는 내부 토픽에 저장되는 것은 알겠는데, 테이블 DDL 정보는 따로 저장하는 곳이 있는 것인지 궁금합니다.
-
미해결김영한의 실전 자바 - 기본편
arraylists
Using ArrayLists도 자바 기본이나 기초편에서 다뤄주시나요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
송아지 찾기 시간초과 질문
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class FindCow { static int personPos; static int cowPos; static int[] idx = {5, 1, -1}; public static int solution(int n) { boolean[] visit = new boolean[10_001]; Queue<Integer> queue = new LinkedList<>(); visit[n] = true; queue.offer(n); int level = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Integer curPos = queue.poll(); for (int k = 0; k < 3; k++) { int nextPos = curPos + idx[k]; if (nextPos == cowPos) { return level + 1; } if (nextPos < 10_001 && nextPos > 0 && !visit[nextPos]) { queue.offer(nextPos); visit[nextPos] = false; } } } level++; } return 1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); personPos = in.nextInt(); cowPos = in.nextInt(); System.out.println(solution(personPos)); } }안녕하세요! 좋은 강의 항상 감사드립니다.강의 중, 송아지 찾기(BFS)에서 시간 초과가 떠서 확인해 보니, 강의에서 올려주신 코드와 딱히 다른 부분이 없어 보이는데 시간초과가 납니다. 왜 그럴까요?
-
미해결[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발
로긴할 때 폰으로 보안코드 보낸거 입력하라는거요..
로긴할 때 폰으로 보안코드 보낸거 입력하라는거요..정보 저장하고 신뢰하는 기기로 설정해서 수동 로긴을 해도다시 프로그램으로 로긴 하려하면 또 보안코드 입력하라고 떠서로긴부터 막히는데 방법 없을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
여전히 에러가 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @Test void 상품주문_재고수량초과() throws Exception { //give Member member = createMember(); Item item = createBook("베렌과 루시엔", 39000, 10); int orderCount = 11; //when orderService.order(member.getId(), item.getId(), orderCount); //then assertThrows(NotEnoughStockException.class, () -> {orderService.order(member.getId(), item.getId(), orderCount);}, "재고 수량 예외가 발생해야 한다."); }JUNIT5 환경에서 이런식으로 해보았는데, 테스트 통과가 안되고 여전히 jpabook.jpashop2.exception.NotEnoughStockException: need more stock 에러가 발생하네요 ㅠㅠㅠ 구글링도 해보고 커뮤니티글도 다 찾아보았는데,여전히 해결되지 않아 글 남깁니다. 다른 분들이랑 똑같이 코드 작성한거 같은데 뭐가 문제일까요..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUNIT5, assertj활용한 테스트 코드입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.junit4로 해보려고 해도 org.junit.Assert 가 import 불가능하여 따로 테스트 코드를 짜보았습니다. @Test void 상품주문() throws Exception { //give Member member = new Member(); member.setName("jung"); member.setAddress(new Address("서울", "한강로", "12452")); em.persist(member); Book book = new Book(); book.setName("베렌과 루시엔"); book.setPrice(39000); book.setStockQuantity(10); em.persist(book); int orderCount = 3; //when Long orderId = orderService.order(member.getId(), book.getId(), orderCount); //then Order getOrder = orderRepository.findOne(orderId); assertThat(OrderStatus.ORDER).as("상품 주문시 상태는 ORDER.").isEqualTo(getOrder.getStatus()); assertThat(getOrder.getOrderItems().size()).as("주문한 상품 종류 수가 정확해야 한다.").isEqualTo(1); assertThat(getOrder.getTotalPrice()).as("주문 가격은 가격 * 수량이다.").isEqualTo(39000 * orderCount); assertThat(book.getStockQuantity()).as("주문 수량만큼 재고가 줄어야 한다.").isEqualTo(7); }이런식으로 최대한 강사님의 코드와 비슷한 결과가 나오게 해보았는데, 혹시 차이가 있을까요??
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
apk 빌드하면 먹통되요
핸드폰에서 한번 해볼까 하고 안드로이드 apk 빌드해서 LDplayer 나 핸드폰 s22 울트라 정도에서 해보려했는데 안되네요 혹시 다른 버전은 다 되고 있나요?일단 터치 안되서 모바일 터치로 변경 했구요그러니 잘되네요 Game Sceen으로 넘어가는 부분도물론 찾아 봐야 겠지만 어떤 문제인지 폰에서는넘어가지지 않구요. 다른분들은 다 잘 되시나요?시뮬레이터에서는 아무 이상없이 잘됩니다.핸드폰 및 LDPlayer 가면 그러네요...Window 빌드 해서 해보니 안되네요...시뮬레이터 빼고 다안될듯 혹시 알아내신분있으면 공유 부탁드려요~~애러가 상당히 많이 나는데...뭐가 문제지 흠.. 강의 소스 그대로 사용했어요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
조회수 증가 관련 질문 있습니다.
제가 블로그를 만들어 보고 잇는데 해당 게시물을 보면 조회수가 증가하는데 같은 ip일경우에는 30분을 기준으로 조회수가 증가하게 작업을 하려고 합니다.이때 제가 게시물 조회시 ip와 해당 게시물의 id를 저장하는 테이블을 만들어서 작업을 해보려는데 이때 ip만 db상에서 암호화 한다면 보안상으로 안전할까요??
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-A 왜 틀렸는지 잘 모르겠습니다.
선생님 안녕하세요!최소값 확인오름차순모두 처리 했다고 생각하는데 1%에서 '틀렸습니다'로 나옵니다 ㅎㅎ...예제랑 제가 생각한 반례를 몇 가지 넣어보았으나 잘 통과하는 것으로 보입니다. 어떤 문제가 있을까요? 코드 링크 첨부드립니다.(변수명 너무 대충써서 죄송합니다..)https://www.acmicpc.net/source/74000922 항상 감사합니다.
-
미해결[입문자를 위한] Power BI로 시작하는 데이터 시각화
LEFT 함수에 대해 질문이 있습니다.
5분 45초에서 LEFT 함수 식으로 '년도 = LEFT([period],1,4)'를 입력하셨는데, 여기서 1을 왜 입력하는지 모르겠습니다.'2019'라는 총 네 자리 수를 도출하려는 것이니 '년도 = LEFT([period],4)'만 입력하면 되는거 아닌가요?
-
미해결Objective-C 강좌 - 12개 앱 만들면서 배우는 iOS 아이폰 앱 개발
144번째 강의는 어디 있는건가요?
144번째 강의는 어디 있는건가요?진도율이 143강/144강(99.31%)에서 진행이 안됩니다.최종 143강까지가 마지막으로 확인됩니다. 수강완료할수 있게 확인 부탁드립니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@PathVariable 질문 입니다.
@PathVariable 어노테이션 사용 시 위와 같이 GetMapping의 {userId} 와 변수 명이 같으면name="userId" 옵션을 생략해도 된다고 말씀해주셨는데 옵션을 생략하면 500 에러가 나고,옵션을 작성해주면 성공하는데 이런 경우에는 뭐가 문제인가요?
-
해결됨Vue 3 시작하기
target[prop] 질문
target[prop] = newValue; 를 하지 않고 render(newValue)를 해도 값이 바껴서 출력되는걸 확인할 수 있는데, target[prop]에 newValue 값을 넣어주는 이유가 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
[섹션6.중복 등록과 충돌] 동일 이름의 빈 수동, 자동 등록시 오버라이딩 관련하여
안녕하세요. 질문이 생겼습니다. 강의: 섹션6. 중복 등록과 충돌내용:3분 50초: "동일 이름의 빈이 자동, 수동 등록될 경우 수동등록을 우선하여 오버라이딩한다."AutoAppConfig.java에서 수동 빈 등록 메서드에 오타를 내어 반환 타입을 MemberRepostitory 대신 MemoryMemberRepository로 설정하였습니다. @Configuration @ComponentScan( // basePackages = "hello.core.member", // basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class) // AppConfig가 등록되지 않도록 제외시킴. ) public class AutoAppConfig { @Bean(name = "memoryMemberRepository") public MemoryMemberRepository memberRepository() { // 오타부분 return new MemoryMemberRepository(); } }이 경우 AutoAppConfigTest실행시에 overriding 관련 로그가 없습니다.스프링 부트를 실행해도(CoreApplication 실행) 에러가 발생하지 않습니다.질문1) 같은 이름으로 같은 타입의 객체가 빈 등록되는데 오버라이딩되지 않으면 어떻게 된 것인지2) 이 상황에서 빈 수동 등록 메서드의 반환형이 어떤 영향을 미친건지 감사합니다.
-
미해결
Spring Security 와 JWT 난관에 봉착했습니다...
안녕하세요.이제 개발 공부를 시작한 학생입니다.이번에 Security 와 Jwt 에 대해서 배웠는데, 실습 간 문제가 발생하여 부끄럽지만,,, 질문드립니다.문제의 핵심은 "토큰을 헤더에 담아서 요청했는데, 왜 토큰 값이 전달되지 않는가 ?" 입니다... 먼저 코드 보여드리겠습니다. WebSecurityConfig @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // CSRF 설정 http.csrf((csrf) -> csrf.disable()); http.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) ); http.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정 .requestMatchers("/").permitAll() // 메인 페이지 요청 허가 .requestMatchers("/user/**").permitAll() // '/user/'로 시작하는 요청 모두 접근 허가 .anyRequest().authenticated() // 그 외 모든 요청 인증처리 ); http.formLogin((formLogin) -> formLogin .loginPage("/user/login-page").permitAll() .defaultSuccessUrl("/test", true) // 로그인 성공 시 /test 경로로 리다이렉트 ); // 필터 관리 http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class); http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); }우선 config 쪽에서는 리소스 및 기본페이지, user 로 시작하는 페이지는 인증 없이 접근 가능하도록 했습니다..anyRequest().authenticated() <- 이걸 설정하면 나머지 요청들은 인증이 필요하다는 것으로 알고 있습니다. JwtAuthenticationFilter인증 필터는 다음과 같습니다. protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException { log.info("로그인 성공 및 JWT 생성"); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(new ObjectMapper().writeValueAsString(new ApiResponseDto("로그인 성공", HttpStatus.OK.value()))); String loginId = ((UserDetailsImpl) authResult.getPrincipal()).getUsername(); UserRoleEnum role = ((UserDetailsImpl) authResult.getPrincipal()).getUser().getRole(); String accessToken = jwtUtil.createAccessToken(loginId, role); String refreshToken = jwtUtil.createRefreshToken(loginId); redisService.saveRefreshToken(loginId, refreshToken); // Access Token 헤더에 저장 response.addHeader(JwtUtil.AUTHORIZATION_HEADER, accessToken); // Refresh Token 쿠키에 저장 Cookie refreshCookie = new Cookie("refreshToken", refreshToken); refreshCookie.setHttpOnly(true); refreshCookie.setSecure(true); refreshCookie.setPath("/"); response.addCookie(refreshCookie); }Access 토큰과 Refresh 토큰을 구현해보고 싶어서 위와 같이 구현하였습니다. login.html<h1>로그인</h1> <form id="loginForm"> <label for="loginId">아이디:</label> <input type="text" id="loginId" name="loginId" required> <br> <label for="password">비밀번호:</label> <input type="password" id="password" name="password" required> <br> <button type="button" id="loginButton">로그인</button> </form> <script> $(document).ready(function() { $('#loginButton').on('click', function() { const loginId = $('#loginId').val(); const password = $('#password').val(); $.ajax({ type: "POST", url: "/user/login", contentType: "application/json", data: JSON.stringify({ loginId: loginId, password: password }), success: function(data, textStatus, xhr) { // 응답 헤더에서 Access Token 추출 const accessToken = xhr.getResponseHeader('Authorization'); if (accessToken) { // 로컬 스토리지에 Access Token 저장 localStorage.setItem('Authorization', accessToken); // 모든 AJAX 요청에 대해 Authorization 헤더를 설정 setupAjaxRequests(accessToken); // 로그인 성공 후 리다이렉션 window.location.href = '/test'; } else { alert('Authorization token not found'); } }, error: function(jqXHR, textStatus, errorThrown) { alert('로그인 실패: ' + textStatus); } }); }); }); function setupAjaxRequests(token) { $.ajaxSetup({ headers: { 'Authorization': token } }); } </script> </body> </html> 그래서 실제로 위와 같은 페이지를 만들어서 로그인을 시도해보면 로컬스토리지와 쿠키에 각각 토큰이 담기는 것을 확인할 수 있었습니다.그런데 여기서 문제가 있는 게, window.location.href = '/test'; 아것이 동작이 안된다는 것입니다...분명 '/test'; 라고 명시해두면 TestController@Controller public class TestController { @GetMapping("/test") public String testPage() { return "test"; } } 해당 api 가 호출되어 test 라는 페이지가 떠야하는 게 아닌가요 ? ㅠㅠㅠㅠtest page 는 우선 body 에 "테스트 페이지입니다" 정도로만 제작해두었습니다. 왜 안될까,,, 고민하다가 우선 인가 필터 쪽 로그를 찍어서 확인했습니다. JwtAuthorizationFilter @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 log.info("헤더에서 토큰 추출"); String tokenValue = jwtUtil.getJwtFromHeader(req); log.info("토큰 : " + tokenValue); if (StringUtils.hasText(tokenValue)) { // 토큰 유효성 검사 if (!jwtUtil.validateToken(tokenValue)) { log.info("Token Error"); return; } Claims info = jwtUtil.getUserInfoFromToken(tokenValue); try { setAuthentication(info.getSubject()); } catch (Exception e) { log.error(e.getMessage()); return; } } else { log.info("토큰이 없습니다."); } filterChain.doFilter(req, res); }이와 같으며, 로그인 성공 후 window.location.href = '/test'; 동작할때와 그냥 주소창에 localhost8080/test 로 접근해 본 결과 로그가 이렇게 찍히는 겁니다...2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 헤더에서 토큰 추출 2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 토큰 : null 2024-02-25T22:49:52.276+09:00 INFO 54640 --- [nio-8081-exec-2] JWT 검증 및 인가 : 토큰이 없습니다.대체 왜 토큰이 없는 걸까....분명 로컬 스토리지에 Access Token 저장된 거 개발자 도구로 확인했고, 이를 다시 Header 담아서 전송하는 것까지 login.html 쪽에 구현했다고 생각했는데,,, 이게 의도한 방향대로 흘러가질 않습니다. 대체 왜 토큰이 비어있으며, test 라는 페이지에 접속하지 못하는 걸까요...제가 놓친 부분이 있을까요 ?
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 개수를 증가시키는 코드에서 궁금한 점이 있습니다.
public Long increment() { return redisTemplate .opsForValue() .increment("coupon_count"); } ---------------------------------------------------- public void apply(Long userId) { Long count = couponCountRepository.increment(); if (count > 100) { return; } couponRepository.save(new Coupon(userId)); }코드에서 쿠폰을 100개 발급할 수 있도록 했는데만약 동시에 100만 개의 요청이 들어오게 되면 redis에도 똑같이 100만 번의 요청이 가서 100개의 요청을 제외한 나머지 불필요한 요청을 redis가 처리해야 되는 문제가 발생할 것 같습니다. public void apply(Long userId) { Long count = couponCountRepository.getCount(); if (count > 100) { return; } couponCountRepository.increment(); couponRepository.save(new Coupon(userId)); }그래서 쿠폰 개수를 먼저 가져와서 검증 후 개수를 올리게 되면 또다시 Race Condition이 발생할 것 같습니다.실무에서는 어떠한 방식으로 코드를 작성하시는지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
자바 스프링부트 버전 선택
스프링부트 버전이 2.7x 버전은 없는데 무엇으로 선택해야 하나요?
-
해결됨Flutter로 SNS 앱 만들기
signOut()에서 에러가 났습니다.
await context.read<AuthProvider>().signOut();main_screen.dart에서 signOut에서 에러가 났습니다.메일 보낼게요