묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Collection Bean 검증 질문입니다
안녕하세요! 영한님! 항상 강의 잘 보고 있습니다. 사실은 영한님 팬이기도 해요.아무튼 제가 며칠 계속 고민하던 부분이 있어요.제 목표는 컬렉션 타입과 상관 없이 컬렉션 안에 선언되어 있는 객체의 Bean Validation을 수행하고 싶어요.@RequestBody @Validated List<ItemSaveForm> 를 사용하게 되면 ItemSaveForm에 대한 검증이 아닌 List에 대한 검증 처리가 되더라고요. 그렇다고 List<@Validated ItemSaveForm> 는 컴파일 에러가 납니다.물론 저 스스로 해결하고자 많은 곳을 돌아 다녀 보았고 찾아낸 방법은 Validator를 구현한 객체(CollectionValidator)를 만들어서 validate 메서드 구현 을 했습니다. 이후 ItemController에서 CollectionValidation 를 주입 받아 collectionValidator.validate(itemList, bindingResult);를 통해서 검증 처리를 하는 법을 알아냈습니다.하지만 모든 Collection 마다 주입과 collectionValidator.validate 코드를 넣는게 비효율적이라 생각해서 어노테이션으로 만들거나 인터셉터에서 처리하고 싶었습니다.인터셉터에서 처리하고 싶었지만 CollectionValidation의 validate 메서드는 Errors 객체를 인자로 받는데 HandlerMethodArgumentResolver의 resolveArgument인자에서 errors 객체를 뽑아낼 방법이 안보이네요.어노테이션으로 만들고자 한 부분은 어노테이션 안에 Errors 객체를 선한 할 수가 없어서 CollectionValidator를 불러낼 수가 없었습니다.다른 해결 책이 있을 까요? 아니면 제가 보지 못한 부분이 있었던 걸까요?혹시 결국 스프링 입문때 잠시 다루었던 AOP를 통해서만 해결할 수 있는 걸까요? 어노테이션 만들기를 검색하다보니 AOP를 결국 다뤄야 하더라고요 ㅜㅜ아래 제 코드와 함께 올리겠습니다.@Data public class PatternDto { //이 어노테이션에게 검증을 맡기고자 합니다. @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message ="잘못된 번호 형식입니다.") private String phoneNumber; }@RestController public class ValidationItemApiController { //private final CollectionValidator validator; @PostMapping("/list") public Object addList(@RequestBody List<PatternDto> request, BindingResult bindingResult){ //validator.validate(request, bindingResult); -> 이 부분을 어노테이션이나 인터셉터로 처리하고 싶어요. log.info("list valid"); if(bindingResult.hasErrors()){ log.error("검증 오류 발생 {}", bindingResult); return bindingResult.getAllErrors(); } log.info("성공 로직 실행"); return request; } }@Component @Slf4j public class CollectionValidator implements Validator { private SpringValidatorAdapter validator; public CollectionValidator() { this.validator = new SpringValidatorAdapter( Validation.buildDefaultValidatorFactory().getValidator() ); } @Override public boolean supports(Class<?> clazz) { return true; } @Override public void validate(Object target, Errors errors) { if(target instanceof Collection){ Collection collection = (Collection) target; for (Object o : collection) { validator.validate(o,errors); } } else validator.validate(target,errors); } }//이 검증기를 통해 List<@Valid PatternDto>와 같이 검증하고 싶었지만 //validtor.validate에게 검증을 위임하려고 할때(많은 검증 로직들이 간소화 되기 때문에) validate메서드의 두번째 인자인 errors //에 넣을 값을 찾지 못한게 문제였습니다. //ArgumentResolver를 통해 해결하고자 했지만 이때도 validate의 errors 인자를 넣을 값을 못찾았습니다. @Component @Slf4j @RequiredArgsConstructor public class CustomValidator implements ConstraintValidator<CustomValid, List<PatternDto>> { private final CollectionValidator validator; @Override public void initialize(CustomValid constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(List<PatternDto> values, ConstraintValidatorContext context) { log.info("validator 로직 실행"); validator.validate(values,null); //null 대신에 어떤 값을 넣어야 할까요? 이 부분만 해결 되어도 문제가 해결 될거 같아요. return true; } }
-
미해결파이널 코딩테스트 : 프론트엔드
좋아요 기능 만드는 강의가 완전하지 않아요!
현재 강의를 듣고 있는데, 갑자기 좋아요 기능이 완성되있네요.로컬스토리지에다 추가하는 강의가 사라진 것 같아요.올려주시면 감사하겠습니다.
-
미해결[파이토치] 실전 인공지능으로 이어지는 딥러닝 - 기초부터 논문 구현까지
주가예측에 Autoencoder를 적용할 수 있나요??
안녕하세요. 주가예측의 LSTM모델을 기반으로 Autoencoder에 적용 가능할까요?해보진 않았는데, 강의해주신 코드에 데이터 전처리만 해서 사용해도 될것 같아서 질문드립니다.
-
미해결[개념반]배워서 바로 쓰는 SQL 쿼리
실습문제 3-4(functions) 질문
안녕하세요실습문제 3-4 들으면서 궁금한 점이 생겨 질문드립니다.질문 사항은 아래와 같은데요,1) substr 함수(첫번째 칼럼명 , 추출할 문자 시작, 추출할 문자 끝) 과 같이위와 같은 방식으로 추출되는 것으로 알고 있는데 employees의 생년월일에서 월만 추출하고자 한다면substr(birthdate, 6, 7) 과 같이 작성하는 것이 아닌가요?해당 함수로 작성할 시, 이상하게 추출이 나와 질문드립니다.2) 문제 질문말그대로 월별로 각각 몇명이면, 년도 상관없이 7월에 몇명, 9월에 몇명 이런식으로 추출되어야 할 것 같은데 강의 내의 방법이라면 연도-월별로 각각 추출되어서 질문드립니다.예를 들자면, 해당 데이터에 연도는 달라도 7월달 생일자가 2명이면, "7월 - 2명" 과 같이 카운트가 되어야하는게 아닌가 싶습니다.답변 주시면 감사하겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@orderColumn에서 update 쿼리 관련 질문이 있습니다
안녕하세요 강의를 듣던 중에 궁금한게 생겨서 남겨봅니다.@OrderColumn을 사용해서 AddressEntity 값 3개를 Member AddressHistory에 추가해보았고, 0,1,2로 값이 잘 나오는 걸 확인했습니다. 그런데 제가 0번 값을 삭제 해보았는 데, 예상했던 결과는 총 2번의 update 쿼리 후 1번의 delete 쿼리가 나가는 거였지만, 5번의 update 쿼리 후 1번의 delete 쿼리가 나갔습니다. 왜 이렇게 되는 지 이해가 안되서 올려봅니다.Hibernate: select addresshis0_.MEMBER_ID as MEMBER_I5_0_0_, addresshis0_.id as id1_0_0_, addresshis0_.POSITION as POSITION6_0_, addresshis0_.id as id1_0_1_, addresshis0_.city as city2_0_1_, addresshis0_.street as street3_0_1_, addresshis0_.zipcode as zipcode4_0_1_ from ADDRESS addresshis0_ where addresshis0_.MEMBER_ID=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* create one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=?, POSITION=? where id=?Hibernate: /* create one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=?, POSITION=? where id=?Hibernate: /* delete jpabook.jpashop.domain.AddressEntity */ delete from ADDRESS where id=?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 내부 호출 시 호출 안되는 점 관련해서 질문사항이 있습니다
안녕하세요. 먼저 좋은 강의 감사 드립니다@Transactional 내부 호출 시 호출 안되는 점 관련해서 강의를 듣다가 헷갈리는 점이 있어 문의 드립니다.아래와 같이 컨트롤러에서 유저를 저장하는 부분을 만들어서 호출을 했을 때userService.addUser() 메소드를 호출하는데 이 때 ,removeUser() 메소드의 삭제 로직 이후, 삭제가 끝나면 addUser()의 저장 로직을 타게 된다고 가정했을 때아래와 같이 두 군데의 서비스 메소드 위에 @Transactional 선언을 해주면 내부 호출을 해도 문제가 없을까요?아니면 처음 시작점인 addUser에만 @Transactional 을 선언해줘도 되는걸까요?아니면 제가 잘못 이해한 부분이고, 강의에서 말씀하신대로 무조건 다른 클래스를 생성해서 호출하는 방법으로 사용하면 될까요?@RequestMapping("/api/user")public class UserController{@Autowired private UserService userService;@RequestMapping(method = { RequestMethod.POST }, value = "/save")public String userSave(){userService.addUser(param);}}@Servicepublic class userService{@Autowired private UserDao userdao;@Transactionalpublic String addUser(){removeUser(); //내부메소드 호출userdao.insert(); //USER 테이블 저장로직}@Transactionalpublic void removeUser{userdao.remove(); //USER테이블 삭제로직}}
-
미해결15일간의 빅데이터 파일럿 프로젝트
Hbase 복잡 질의문 사용중 에러 발생입니다.
"2022.01.03, D04지역 모든 스마트가 운전자의 차량번호와 지역번호를 출력하기"를 하던중 정상적으로 출력이 되다가 연결이 끊어지는 현상이 발생 했습니다. 시스템 문제인것 같기도 합니다. 앞의 다른 질의들은 결과가 정상 출력이었습니다. (server02)scan 'DriverCarInfo', {COLUMNS=>['cf1:car_number','cf1:area_number'],FILTER=>"RowFilter(=,'regexstring:30102202') AND SingleColumnValueFilter('cf1','area_number',=,'regexstring:D04')"}
-
해결됨[언리얼 시스템 연구 과정] UE5 스파르타 클래스: 심화편
다운받은 애니메이션 에셋과 컨트롤릭 충돌 관련 의견
안녕하십니까, 강의 잘 봤습니다. 컨트롤릭 설정하는 거에 많은 도움이 됐습니다.다름이 아니라, 기본 로코모션을 다운받은 애님 에셋과 컨트롤릭이 겹쳐 발이 안움직이는 일이 발생하던데, 믹사모 애니메이션까지 충돌합니다.기존 thirdperson 캐릭터 컨트롤 릭을 보니, 강사님과 같은 설정으로 되어있더라고요. 그게 맞긴한데, 그래도애초에 컨트롤 릭에서 IK_foot_l 이라는 본 위치가 Fullbody IK 에 foot_l 위치로 바로 연결되는 것이 문제인 것 같습니다.처음 FootTrace 함수를 만들때부터 목적이 스피어 캐스트로부터 히트된 Z축의 값만 받으면 됐었죠. 그래서 기존 IK_foot_l 본의 Z축 값과 알파보간까지 거친 히트된 Z축 변수값을 더했습니다.제가 실험한 결과는 정상적으로 충돌 없이 되더라고요. 근데 제가 아예 이쪽 분야가 아니라서 해결되도 이게 맞는건지 모르겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
java jar 에러
인텔리제이 터미널에서 했는데java jar에러가 뜨는데 왜 그런걸까요?
-
해결됨Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
[컴포넌트기초] 강의중 명명법 오류가 있습니다!!
10:40쯤에 app-card형식이 카멜케이스라고 하셨는데, 이는 케밥케이스로 알고있습니다!!강의가 기초다지기에 너무 좋습니다! 반복중에 있습니다:)
-
미해결파이썬 입문 및 웹 크롤링을 활용한 다양한 자동화 어플리케이션 제작하기
4-7-6 네이버 & 카카오 주식 정보 가져오기
# [22년 8월 31일 확인]# https://financedata.github.io/posts/finance-data-reader-users-guide.html # pip install FinanceDataReader import FinanceDataReader as fdrimport matplotlib.pyplot as plt# import pandas_datareader.data as webimport FinanceDataReader as fdrimport datetime# 조회 시작 및 종료 날짜start = datetime.datetime(2022,8,16)end = datetime.datetime(2022,8,31)# 네이버 주식 정보 조회df_naver = fdr.DataReader('035420', start, end)# 카카오 주식 정보 조회df_kakao = fdr.DataReader('035720', start, end)# 출력print(df_naver)print(df_kakao)# 윈도우 제목fig = plt.figure('Chart Test')# 차트 사이즈 지정fig.set_size_inches(10, 6, forward=True)# 차트 설정 1plt.plot(df_naver.index, df_naver['Close'], 'b', label="Naver")# 차트 설정 2plt.plot(df_kakao.index, df_kakao['Close'], 'r', label="Kakao")# 범례 위치 지정plt.legend(loc='upper left')# 차트 제목plt.title('Naver & Kakao')# x축 레이블plt.xlabel('Date')# y축 레이블plt.ylabel('Close')# 차트 실행plt.show()
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
페이지를 읽어 오지 못합니다.
컴파일 되고 localhost:8080페이지까지 넘어오는데 servlet-mvc/members/new-form에서 오류가 발생합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JPA @id string 사용시 save 문의
안녕하세요JPA 강의 잘 듣고 있습니다.. 문의 내용Users 모델의 Repository 에서 @Id 가 사용자 ID (String)인 경우 save 할때 알아서 insert / update 목적. 코드[Users.java]@Entity @SuperBuilder @Getter @Setter @NoArgsConstructor public class Users extends JpaBaseEntity{ @Id @Column(name = "userid", unique = true) private String id; private String name; private String departmentName; @JsonIgnore private LocalDateTime lastLogin; @JsonIgnore private String ip; @JsonIgnore @Enumerated(EnumType.STRING) private Authority authority; @Override public String getId(){ return id; } }[JpaBaseEntity.java]@Getter @MappedSuperclass @SuperBuilder @NoArgsConstructor @AllArgsConstructor public abstract class JpaBaseEntity implements Persistable<String> { @Column(updatable = false) protected LocalDateTime createdDateTime; protected LocalDateTime updatedDateTime; @Transient protected boolean isCreatedMode; @Override public boolean isNew() { return isCreatedMode; } @PrePersist private void prePersist() { createdDateTime = LocalDateTime.now(); } @PreUpdate private void preUpdate() { updatedDateTime = LocalDateTime.now(); } }String 형태의 Id 를 사용할 경우 JPA 내부에서 알아서 신규건(insert)인지 기존건(update)인지 확인하기 위해서 extends 를 위한 객체만들었습니다.위와 같이 한 후 save 하는데, 원하는 결과가 아니고 동일 값을 insert 시도를 해서 에러가 발생하네요 ㅠ. 콘솔 에러ERROR 42980 --- [nio-9999-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Unique index or primary key violation: "PUBLIC.PRIMARY_KEY_4 ON PUBLIC.USERS(USERID) VALUES ( /* 1 */ '아이디' )"; SQL statement:급한 마음에 '스프링 데이터 JPA' 까지 수강 이전 순수 JPA 로만 구현하고 있어 모르는 부분이 많습니다.답변 부탁드리겠습니다 (문의 전 관련 키워드 검색해봐도 없어서 문의 남깁니다)
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
css
선생님 제가 볼떈 product index .js 파일에import css 파일을 하는 것을 못 봤는데 css 가 적용이 되더라고요저는 css 파일 처음에 안되서 import 를 하니까 되서 혹시 어떤 이유때문에 그런가요?아 소스코드 보니 작성을 하셧네요 강의에 언제 작성하셧죠.. 제가 못본건가요..
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
모달(Modal) 만들기 Only CSS 애니메이션 모달 : target 가상 클래스 - 모달창 닫을 때는 스크립트 써야 하나요?
항상 수업 잘 듣고 있습니다. 궁금한 점이 있어 글 남깁니다. 모달(Modal) 만들기 Only CSS 애니메이션 모달 : target 가상 클래스 영상에서요. - 모달창 열때는 css : target로 열었는데요. - 모달창 닫을 때는 스크립트 써야 하나요?궁금합니다. 항상 감사드립니다.
-
미해결대세는 쿠버네티스 (초급~중급편)
질문 있습니다!
기본적으로 생성된 Service Account는 별도의 Role / Role Binding 설정 없이 해당 토큰(Post Man)을 사용해서 모든 자원에 접근이 가능했었습니다. Service Account는 기본적으로 어떤 Role과 연결이 될까요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
로그아웃시 regenerate 에러
제로초님, 최근 req.logout()안에 콜백함수 넣어줘야한다고 공지하신거 봐서 그렇게 진행했는데,req.session.regenerate(function(err) {^TypeError: Cannot read properties of undefined (reading 'regenerate')이라는 에러가 나고 있습니다. 아래는 제 메인 app.js 설정입니다.현재 로그아웃은 정상적으로 되고 있으나, dev tool의 네트워크 탭에 로그아웃 버튼 클릭시 post요청은 들어오지 않고, 리덕스의 로그아웃 석세스 이후로는 어떤 서버 요청도 다 실패로 나옵니다. (net::ERR_CONNECTION_REFUSED)조언부탁드립니다.const express = require("express"); const session = require("express-session"); const cors = require("cors"); const passport = require("passport"); const cookieParse = require("cookie-parser"); const dotenv = require("dotenv"); const postRouter = require("./routes/post"); const userRouter = require("./routes/user"); const db = require("./models"); const passportConfig = require("./passport"); dotenv.config(); const app = express(); db.sequelize .sync() .then(() => { console.log("db Connected"); }) .catch(console.error); passportConfig(); app.use(cors({ origin: "http://localhost:3000", credentials: true })); app.use(express.json()); app.use(cookieParse(process.env.COOKIE_SECRET)); app.use(express.urlencoded({ extended: true })); //form data app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, }) ); app.use(passport.initialize()); app.use(passport.session()); app.use("/post", postRouter); app.use("/user", userRouter); app.listen(3065, () => { console.log("Running server"); });<라우터 설정>const express = require("express"); const router = express.Router(); const bcrypt = require("bcrypt"); const { User } = require("../models"); const passport = require("passport"); router.post("/login", (req, res, next) => { passport.authenticate("local", (err, user, info) => { if (err) { console.error(err); return next(err); //To use next, this form is how to extend middleware } if (info) { return res.status(401).send(info.reason); } return req.login(user, async (loginErr) => { if (loginErr) { console.error(loginErr); return next(loginErr); } return res.status(201).json(user); //Final use info to be passed to front server }); })(req, res, next); }); router.post("/logout", (req, res) => { req.logout(() => { res.redirect("/"); }); req.session.destroy(); res.send("ok"); }); router.post("/", async (req, res, next) => { try { //email existence check const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { return res.status(403).send("The email is in use"); } const hashedPassword = await bcrypt.hash(req.body.password, 10); await User.create({ //inserting data to table asynchronously email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); res.status(200).send("ok"); } catch (error) { console.error(error); next(error); } }); module.exports = router;
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
수정
지금 배포를 한상태에서 제가 파비콘과 타이틀을 바꾸고 싶은데 수정후에 다시 배포를 하려면 어떻게해야하나요
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
딕셔너리 질문있습니다!
딕셔너리에서 키와 아이템을 추가할 때 a["address"] = "seoul" 이렇게 추가하셨는데, 딕셔너리에선 중괄호{}를 써야하는 거 아닌가요?! 왜 리스트형식으로 추가를 하는지 궁금합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
궁금한게 있습니다
제가 리액트부분을 잘 몰라서 질문드립니다. 제가 이해한것이 맞는지 궁금해서 질문드립니다. 리액트에서 파일 업로드를 해줘서 저한테 파일을 넘겨주면 제가 DB에 파일명과 파일경로를 저장하고 그 경로에 사진을 저장합니다. 리액트에서 저장했던 이미지를 띄우려면 제가 DB에 저장된 파일명과 파일경로를 리액트에 넘겨주고 리액트가 그 경로에서 그 파일명을 가진 사진을 웹에 띄울 수 있다. 라고 이해를 하고있는데 혹시 이게 맞을까요?